Qt和链接到外部DLL



我已经开发了一个程序,我正试图让这个程序与其他公司生产的可控光源一起工作。我已经给公司发了电子邮件,他们同意把他们的外部库作为DLL发给我。

我使用Qt 4.8.1开发了我的所有软件,并使用MSVC2008进行了编译。

可控灯光的DLL是在Visual Studio 2008中编译的,是用C++或C#编写的(制造商不确定)。我得到的只是DLL和一个文本文件,上面写着我必须:

  1. 添加DLL作为对我的项目的引用
  2. using LightName;添加到类的顶部
  3. 实例化对象的实例,如下所示:LightName *ln = new LightName();
  4. 使用新创建的LightName实例调用函数void turnOn()

首先,我觉得奇怪的是,外部库要求我实例化他们对象的实例,尤其是当它用于一个简单的硬件时。

其次,另一家公司没有给我提供接口文件。

我的问题是:如果没有Qt环境中的接口头文件,我如何链接到C++DLL并公开嵌套在该库中的函数?有没有办法为外部库创建一个接口?


我已经尝试过使用QLibrary并执行以下操作:

QLibrary myLib("mylib");
typedef void (*MyPrototype)();
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
if (myFunction)
myFunction();

然而,这不起作用,因为我得到的DLL不是一个C DLL,而且我没有接口,所以Qt不知道它需要解析什么符号。


我尝试使用dumpbin/EXPORTS命令显示从DLL导出的所有定义。不幸的是,这无法产生任何东西。我希望我能从中得到一些混乱的C++,然后我可以解读它来制作我自己的标题。


我曾尝试使用依赖性助行器(非常有用的工具),但它无法解析任何符号来给我一些函数定义。


QLibrary只有在库具有导出为C符号的函数时才对您有帮助。如果这是C++,您可以转储符号表,并查看这是否足够。必须对名称进行区分:尝试查找dumpbin或类似名称。然而,你可能无法做到这一点,这取决于符号是如何定义的。在这种情况下,你将不得不要求标题:阅读这个。

要求您"实例化他们对象的实例"是绝对合法的。这只是他们的设计决定,使dll接口面向对象(与普通的extern "C"相反)。QtCore.dll也只是其他人的DLL,您一直在实例化他们的对象。

但这也意味着你将有更困难的时间来调用DLL。这些符号不是"C"符号(不能以这种方式导出类),所以QLibrary不能为您做任何事情。您可以从DLL中尝试dumpbin /EXPORTS,然后乏味地解开它们以重建类声明。幸运的是,有工具可以帮助你(甚至在线)

但是,不为这样的DLL提供头文件首先是完全愚蠢的。

相关内容

  • 没有找到相关文章

最新更新