Sla*_*out 30 c c++ name-mangling extern
我正在尝试创建一个导出名为"GetName"的函数的DLL.我希望其他代码能够调用此函数,而无需知道损坏的函数名称.
我的头文件如下所示:
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT TCHAR * CALLBACK GetName();
Run Code Online (Sandbox Code Playgroud)
我的代码看起来像这样:
#include <windows.h>
#include "PluginOne.h"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
return TRUE ;
}
EXPORT TCHAR * CALLBACK GetName()
{
return TEXT("Test Name");
}
Run Code Online (Sandbox Code Playgroud)
当我构建时,DLL仍然导出名为"_GetName @ 0"的函数.
我究竟做错了什么?
Dew*_*wfy 25
小修正 - 成功通过clinet解析名称
extern "C"
Run Code Online (Sandbox Code Playgroud)
必须像出口一样出口.
extern"C"会将proc的名称减少为:"_ GetName".
您可以在.def文件中使用EXPORTS部分的帮助强制任何名称
对于具有__stdcall约定的DLL导出,这是正常的.在@N 表示该函数发生在其参数的字节数 -在你的情况下,零.
请注意,在函数定义中使用"关键字__declspec(dllexport)"时,从DLL导出的MSDN页面专门说"使用__stdcall调用约定".
小智 6
正确答案如下:
extern "C" int MyFunc(int param);
Run Code Online (Sandbox Code Playgroud)
和
int MyFunc(int param);
Run Code Online (Sandbox Code Playgroud)
是两个使用不同内部命名的声明,首先是C风格,第二个是C++风格.
构建工具所需的内部命名,以确定函数接收哪些参数,返回什么类型等,因为C++更复杂(oop,重载,虚函数等) - 它使用更复杂的命名.调用约定也会影响c和c ++命名.
当以相同的方式使用__declspec(dllexport)时,将应用这种命名方式.
如果要省略导出例程的名称修改,请将模块定义文件添加到项目中,键入它(在这种情况下,您不需要declspec dllexport):
LIBRARY mylib
EXPORTS
MyFunc
Run Code Online (Sandbox Code Playgroud)
这将省略明确的名称装饰(下面的示例).
_MyFunc (c style, __cdecl)
_MyFunc@4 (c style, __stdcall)
?MyFunc@@YAHH@Z (c++ style, __cdecl)
?MyFunc@@YGHH@Z (c++ style, __stdcall)
Run Code Online (Sandbox Code Playgroud)