Dependency Walker 在函数名后显示@x

Pix*_*xel 2 c c++ dll dllexport

我正在为一个软件编写一个插件 DLL,该 DLL 编译得很好,但该软件无法访问 DLL 的功能。我确实知道该软件知道 DLL。

当我在 Dependency Walker 中检查 DLL 时,函数名称已@x附加到末尾,例如Foo@4,这意味着 Foo 有 1 个参数(函数参数的数量乘以 4)。

但是,当我检查已知可以工作的插件 DLL 时,该 DLL 函数没有@x附加到末尾。由于已知此 DLL 可以工作而我的 DLL 无法工作,因此我认为这与它有关。

运行的 DLL 使用__declspec(dllexport) __stdcall其导出的函数。请注意,我只有好的 DLL 的源代码。我知道它有效,因为我有 DLL 文件本身,我没有自己编译它。据我所知,这是在 Borland IDE 中编译的,所以这可能是 Eclipse 特定的问题?

有谁知道可能有什么问题和/或我如何使 DLL 正常工作?

编辑我应该指出我使用的是带有 MINGW 编译器的 Eclipse IDE。

Dav*_*nan 5

Dependency Walker 显示的名称是真实名称。它们是修饰名称,存在@<num>表示__stdcall使用__declspec(dllexport).

如果您在加载时使用随附的导入库(.lib 文件)链接到 DLL,那么真实名称和修饰名称之间的映射将包含在该导入库中。如果在运行时链接,GetProcAddress则需要使用修饰名称。

由于您正在编写插件,因此主机将使用运行时链接。而且您必须遵守其特定的命名约定。这意味着您需要抑制名称修饰。对于__stdcall函数,这意味着您必须使用 .def 文件而不是 .def 文件导出函数__declspec(dllexport)

当然,您在编写插件时弄错了调用约定是合理的。或许是主持人期待的cdecl。我无法从这里判断您应该使用哪种调用约定。主机应用程序的文档可能会指定调用约定。