依赖性沃克在功能名称后显示@x



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

当我检查依赖关系Walker中的DLL时,功能名称已添加到末尾,例如Foo@4这意味着FOO具有1个参数(函数参数数量乘以4)。

但是,当我检查已知可行的插件DLL时,DLL函数最终没有附加@x。由于已知此dll可以正常工作,而且我的DLL不起作用,所以我认为这与它有关。

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

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

edit 我应该指出我正在使用Eclipse IDE,与Mingw编译器一起使用。

依赖关系沃克所显示的名称是真实名称。它们是装饰的名称,@<num>的存在表示__stdcall__declspec(dllexport)导出的CC_6功能。

如果您使用随附的导入库(.lib文件)链接到DLL,则该导入库中包含True Name和Deminated Name之间的映射。如果您在运行时与GetProcAddress链接,则需要使用装饰的名称。

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

当然,当您编写插件时,您的呼叫惯例错误是合理的。也许主机期望cdecl。我无法从这里看出您应该使用的召集约定。主机应用程序的文档大概将指定调用约定。

@x语法意味着呼叫者必须清理堆栈的 x字节。那是因为您使用了_stdcall调用约定。现有代码假定_cdecl功能,不会清理堆栈,并且因此无法与您的DLL一起使用。

相关内容

  • 没有找到相关文章

最新更新