我正在为软件编写一个插件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文件而不是@x
0导出功能。
当然,当您编写插件时,您的呼叫惯例错误是合理的。也许主机期望cdecl
。我无法从这里看出您应该使用的召集约定。主机应用程序的文档大概将指定调用约定。
@x
语法意味着呼叫者必须清理堆栈的 x
字节。那是因为您使用了_stdcall
调用约定。现有代码假定_cdecl
功能,不会清理堆栈,并且因此无法与您的DLL一起使用。