我已经开发了一个程序,我正在努力使这个程序与其他公司制造的可控光源一起工作。我已经给公司发了电子邮件,他们同意将他们的外部库作为DLL发送给我。
我使用 Qt 4.8.1 开发了所有软件,并使用 MSVC2008 编译。
可控灯的DLL是在Visual Studio 2008中编译的,而是用C ++或C#编写的(制造商不确定)。我得到的只是DLL和一个文本文件,说我必须:
using LightName;
添加到班级LightName *ln = new LightName();
首先,我发现奇怪的是外部库要求我实例化其对象的实例,特别是当它用于简单的硬件时。
其次,另一家公司没有为我提供界面文件。
我的问题是: 如何在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 ++,然后我可以解读自己的标题。
我尝试使用dependency walker(非常有用的工具),但它无法解析任何符号以给我一些函数定义。
答案 0 :(得分:1)
如果库具有导出为C符号的功能,QLibrary只会帮助您。如果这是C ++,您可以转储符号表并查看是否足够。名称必须是demangled:尝试查找dumpbin或类似的。但是,您可能无法执行此操作,具体取决于符号的定义方式。在这种情况下,您必须要求标题:read this。
答案 1 :(得分:1)
要求你“实例化他们的对象实例”是绝对合法的。简单地说,他们的设计决定是使dll接口面向对象(与普通extern "C"
相反)。 QtCore.dll
也只是别人的DLL,而且你一直在实例化它们的对象。
但这也意味着你将有更难的时间来调用DLL。符号不是“C”符号(不能以这种方式导出类),因此QLibrary
无法为您做任何事情。您可以从DLL中尝试dumpbin /EXPORTS
,然后tediously unmangle them来重建类声明。幸运的是,有一些工具可以帮助你(even online)
但是,首先没有为这样的DLL提供头文件是完全愚蠢的。