0

我在 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

我已将 lib 包含在 VC++ 链接器设置中。

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

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

此致

丹尼尔·马歇尔

4

1 回答 1

0

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

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();

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

于 2011-08-30T23:14:47.837 回答