【问题标题】:VC++ / Dev-C++: How to include an DLL?VC++/Dev-C++:如何包含 DLL?
【发布时间】:2011-11-06 11:38:28
【问题描述】:

我在 Delphi 中编写了一个导出函数的 DLL。我想在不使用动态链接(LoadLibrary() API-Call)的情况下在 C++ 程序中使用这些函数。

“导入”声明将是

extern "C" int __stdcall getVersionNumber();

我主要使用创建 Windows 可执行文件的 Bloodshed Dev-C++。但我不知道如何告诉编译器它应该从“STATMONDLL32.dll”导入函数“getVersionNumber”。

在我用谷歌搜索问题很多小时后,没有任何结果(只有关于 .a 文件和 .lib 文件的奇怪内容,我没有通过 Delphi 编译......)我还安装了 VC++,但即使在那里,我也找不到告诉编译器使用特定 DLL 的方法。

我已经为这个 DLL 创建了一个 DEF 文件 - 我如何告诉 Dev-C++ 和/或 VC++ 使用它? (首选 Dev-C++)

// 编辑:Delphi 正在创建 UNDECORATED 符号。该符号正是“getVersionNumber”。

我创建了以下带有装饰别名的 DEF 文件:

LIBRARY   STATMONDLL32
EXPORTS
  getVersionNumberA = _getVersionNumberA@0

我用 VC++ "lib.exe" 创建了一个 *.lib 文件:

lib.exe /DEF:StatMonDll32.def /OUT:StatMonDll32.lib

我已在 VC++ 链接器设置中包含该库。

但是 VC++ 告诉我它无法解析外部符号 _getVersionNumberA@0 !请帮忙!

// 编辑:我已在此处上传 DLL:http://www.viathinksoft.de/temp/StatMonDll32.dll。你能用 VC++ 访问符号 getVersionNumberA 吗?我从 6 天开始就在寻找解决方案:'-(

最好的问候

丹尼尔·马歇尔

【问题讨论】:

标签: windows visual-c++ dll dev-c++


【解决方案1】:

您可以使用动态链接,它应该按照以下方式工作:

extern "C" typedef int (__stdcall *pfnadd)(int a, int b);
extern "C" typedef int (__stdcall *pfngetversion)(void);
HMODULE mod = LoadLibraryA("mydll.dll");
pfnadd add = (pfnadd)GetProcAddress(mod, "Add");
pfngetversion getVersionNumberA =
       (pfngetversion)GetProcAddress(mod, "getVersionNumberA");

然后你可以使用函数指针调用:

add(1, 2);
std::cout << getVersionNumberA();

虽然,您的问题似乎包含两个不同功能的点点滴滴!

【讨论】:

  • 感谢您的评论。我知道我可以使用动态链接,但我想以静态方式进行,例如WinAPI DLL 已链接。例如,在我的帖子中,我谈论了不同的功能,但我在测试中只使用了 1 个名称。我想知道为什么没有人知道这个简单问题的答案。我只想静态链接未修饰的函数名称。 (注意:如果名称被“@0”修饰,它会起作用(经过测试)。但事实上,Delphi 会创建未修饰的符号)。
  • @Daniel:对不起,我错过了你问题开头的那一行,你说“没有LoadLibrary”。您需要创建一个与 DLL 匹配的静态导入库。 cygwin 为此提供了很好的工具(解释了你在 google 上了解到的 .a 文件),MSVC++ 则更少,而且我不知道 Dev-C++。
  • 我不确定什么是“静态导入库”。我不是已经用“lib.exe”创建了它,它从我的 *.def 文件中生成了一个 *.lib 文件吗?
  • @Daniel:我不知道你用什么选项lib.exe,但如果它仍然没有链接,你就弄错了。
  • 我用这个命令做到了: "lib.exe /DEF:StatMonDll32.def /OUT:StatMonDll32.lib" 。创建了 lib 文件(我已将其包含在 VC++ 链接器设置中)。问题是 DLL 有未修饰的符号“getVersionNumberA”,而 VC++ 想要访问“_getVersionNumberA@0”(因为 stdcall)。我认为 ALIAS 不起作用。我用十六进制编辑器查看了 LIB 文件,看到了“_getVersionNumberA”而不是“_getVersionNumberA@0”。我假设“@0”被意外解释为 DEF 文件中的序数值......我几乎尝试了所有组合。
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2013-01-25
  • 2015-05-02
相关资源
最近更新 更多