如何停止我的DLL的导出函数的名称 – mangling?

我试图创build一个DLL,导出一个名为“GetName”的函数。 我想要其他的代码能够调用这个函数,而不必知道mangled函数名称。

我的头文件看起来像这样:

#ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT TCHAR * CALLBACK GetName(); 

我的代码如下所示:

 #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"); } 

当我生成时,DLL仍然导出名称为“_GetName @ 0”的函数。

我究竟做错了什么?

小改正 – 成功解决名称由clinet

 extern "C" 

必须在出口方面和import方面一样。

extern“C”会将proc的名称缩减为:“_GetName”。

你可以在.def文件的EXPORTS部分的帮助下强制任何名称

这对于使用__stdcall约定的DLL导出来说是正常的。 @N 表示函数在其参数中使用的字节数 – 在你的情况下为零。

请注意, 从DLL导出的MSDN页面在使用“函数定义中的关键字__declspec(dllexport)”时特别说“使用__stdcall调用约定”。

正确的答案如下:

 extern "C" int MyFunc(int param); 

 int MyFunc(int param); 

是两个使用不同内部命名的声明,第一个是C风格,第二个是C ++风格。

内部命名需要构build工具,以确定哪些参数函数接收,什么types返回等,因为C + +更复杂(oop的,重载,虚拟function等) – 它使用更复杂的命名。 调用约定也会影响到c和c ++的命名。

当使用__declspec(dllexport)时,这两种命名方式都是相同的。

如果要省略导出的例程的名称修改,请将模块定义文件添加到项目中,然后键入(在这种情况下,您不需要declspec dllexport):

 LIBRARY mylib EXPORTS MyFunc 

这将省略明确的名称装饰(下面的示例)。

 _MyFunc (c style, __cdecl) _MyFunc@4 (c style, __stdcall) ?MyFunc@@YAHH@Z (c++ style, __cdecl) ?MyFunc@@YGHH@Z (c++ style, __stdcall) 

您可以使用“-Wl, – kill-at”链接器开关来禁用名称修改。

例如,在Code :: Blocks中,在自定义链接器设置中,添加:-Wl, – kill-at