我已经开发了一个程序,我正试图让这个程序与其他公司生产的可控光源一起工作。我已经给公司发了电子邮件,他们同意把他们的外部库作为DLL发给我。
我使用Qt 4.8.1开发了我的所有软件,并使用MSVC2008进行了编译。
可控灯光的DLL是在Visual Studio 2008中编译的,是用C++或C#编写的(制造商不确定)。我得到的只是DLL和一个文本文件,上面写着我必须:
- 添加DLL作为对我的项目的引用
- 将
using LightName;
添加到类的顶部 - 实例化对象的实例,如下所示:
LightName *ln = new LightName();
- 使用新创建的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提供头文件首先是完全愚蠢的。