如何阻止我的DLL的导出函数的名称,忙玲?(How do I stop name-mangling

2019-07-19 04:28发布

我试图创建一个出口一个名为“的GetName”函数的DLL。 我想其他的代码才能够调用此函数,而不必知道已重整的函数名。

我的头文件是这样的:

#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”。

我究竟做错了什么?

Answer 1:

小的修正 - 成功的客户为例域名解析

extern "C"

必须是在出口方面的进口。

为extern “C” 将减少PROC的名字: “_GetName”。

更超过您可以强制任何名称与DEF文件部分出口帮助



Answer 2:

这是正常的,有一个DLL导出__stdcall约定。 该@N 表示该函数采用其参数的字节数 -在你的情况下,零。

需要注意的是从一个DLL导出MSDN页面特别说“用__stdcall调用约定”当使用“在函数的定义关键字__declspec(dllexport)的”。



Answer 3:

正确的答案是:

extern "C" int MyFunc(int param);

int MyFunc(int param);

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

用于构建工具所需的内部命名,以确定哪些参数函数接收,什么类型的回报等,由于C ++是比较复杂的(OOP的,过载,虚函数等) - 它使用更复杂的命名。 调用约定也影响C和C ++ namings。

这两个样式命名的以相同的方式使用__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)


Answer 4:

您可以使用“-Wl, - 杀 - 在”连接开关禁用名字改编。

例如,在代码::块,在自定义链接设置,添加:轮候册, - 杀 - 在



文章来源: How do I stop name-mangling of my DLL's exported function?