2

我已经开发了一个程序,我正试图使这个程序与其他公司制造的可控光源一起工作。我已经给公司发了电子邮件,他们同意将他们的外部库作为 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++,然后我可以整理出自己的标题。


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


4

2 回答 2

1

Well it's absolutely legal to ask you for "instantiating an instance of their object". It's been simply their design decision to make the dll interface object oriented (as contrary to plain extern "C"). QtCore.dll is just someone else's DLL too, and you are instantiating their objects all the time.

But it also means that you will have harder time to call the DLL. The symbols are not "C" symbols (you can't export class that way) so QLibrary can't do anything for you. You can try dumpbin /EXPORTS from the DLL and then tediously unmangle them to reconstruct the class declaration. Luckily there are tools to help you (even online)

But not providing a header file for such DLL is completely dumb in the first place.

于 2012-09-20T10:25:02.263 回答
1

QLibrary 仅在库具有导出为 C 符号的函数时为您提供帮助。如果那是 C++,您可以转储符号表并查看这对您是否足够。必须对名称进行解构:尝试查找 dumpbin 或类似名称。但是,您可能无法执行此操作,这取决于符号的定义方式。在这种情况下,您必须要求提供标题:阅读此

于 2012-09-20T06:23:22.377 回答