在 Qt 中使用第三方 dll(没有可用的 .lib 文件)[重复]
Posted
技术标签:
【中文标题】在 Qt 中使用第三方 dll(没有可用的 .lib 文件)[重复]【英文标题】:Using third party dll in Qt (No .lib file available) [duplicate] 【发布时间】:2014-06-03 13:35:56 【问题描述】:我的一个朋友让我创建一个应用程序来使用“Velleman VM167”来控制一些东西。这个 VM167 只不过是一个带有一些 GPIO 和一些 ADC 的 USB 接口卡。
此 VM167 带有一个 SDK,包含两个 DLL(VM167.dll 和 MPUSBAPI.dll,其中怀疑第一个 DLL 中使用了另一个)和一个头文件 VM167.h
我之前在 Delphi 中成功使用过该卡,但现在想转换为 Qt。由于这只是一个简单的项目,我认为这可能是正确的时间。
我想要做的是导入 DLL 并使用在该 DLL 中实现的功能。我尝试了很多东西并在谷歌上搜索了很多教程,但他们总是使用.lib
或.a
文件。我没有。
有没有办法使用这个DLL并使用Qt控制卡?
我使用 Qt 5.3 和 MinGW 32 位编译器。
产品描述和SDK下载链接: http://www.velleman.eu/products/view/?country=be&lang=en&id=384006
【问题讨论】:
【参考方案1】:由于您使用的是 Qt,因此您可以使用 QLibrary
,尤其是它的 resolve
方法。
【讨论】:
【参考方案2】:在 C/C++ 中使用没有 LIB 文件的 Windows DLL 的方法是通过 LoadLibrary
和 GetProcAddress
。
在您链接到的 VM167 SDK 中有一些示例,一个在 Examples\VM167DemoBCB_dynamic_load\Unit1.cpp
,另一个在 Examples\VM167DemoDevC\main.cpp
。
【讨论】:
感谢您指出正确的示例!这与 QT 站点上的 Qlibrary 类信息一起让我快速启动并运行。不好的是,我不知道我的代码是做什么的......你能简要解释一下这里发生了什么吗? QLibrary VMDLL("VM167"); typedef int (*VOID2INT)(void); VOID2INT OpenDevices = (VOID2INT) VMDLL.resolve("mysymbol");我的想法是我创建一个带有相应参数的 Typedef,并将结果作为一个类型。然后我创建一个这种类型的实例,然后将它的指针地址设置为 DLL 中实际函数的指针地址。有些正确吗? @Jetse:是的,你已经完全理解了。您需要 typedef 以便编译器知道如何将参数传递给函数,以及期望的返回类型。 QLibrary 完成加载 DLL 并找到所需函数的工作,然后返回指向该函数的指针,然后您通过该指针调用该指针。以上是关于在 Qt 中使用第三方 dll(没有可用的 .lib 文件)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
从第三方 DLL 调用 Qt 中的函数在调试模式下工作,在发布时崩溃