我试图创建一个出口一个名为“的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”。
我究竟做错了什么?
小的修正 - 成功的客户为例域名解析
extern "C"
必须是在出口方面的进口。
为extern “C” 将减少PROC的名字: “_GetName”。
更超过您可以强制任何名称与DEF文件部分出口帮助
这是正常的,有一个DLL导出__stdcall
约定。 该@N
表示该函数采用其参数的字节数 -在你的情况下,零。
需要注意的是从一个DLL导出MSDN页面特别说“用__stdcall调用约定”当使用“在函数的定义关键字__declspec(dllexport)的”。
正确的答案是:
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)
您可以使用“-Wl, - 杀 - 在”连接开关禁用名字改编。
例如,在代码::块,在自定义链接设置,添加:轮候册, - 杀 - 在