如何停止DLL的导出功能的名称修改?

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部分的帮助强制任何名称


Mar*_*off 9

对于具有__stdcall约定的DLL导出,这是正常的.在@N 表示该函数发生在其参数的字节数 -在你的情况下,零.

请注意,在函数定义中使用"关键字__declspec(dllexport)"时,从DLL导出的MSDN页面专门说"使用__stdcall调用约定".

  • 正如[here](http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names)所述,克服`__stdcall`错位的唯一方法是使用:`#pragma评论(链接器,"/ EXPORT:SomeFunction = _SomeFunction @@@ 23mangledstuff#@@@@") (3认同)
  • 您的第一个链接已损坏,第二个链接指向下载 (2认同)

小智 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)