2

函数签名是:

void __stdcall Test(char *,int)

函数内使用的__FUNCDNAME__宏返回修饰函数名:

  • 图像内的真实函数名:?Test@@YGXPADH@Z
  • __FUNCDNAME__ 返回:?Test@@YGXPADH@Z

/clr选项打开时(项目 > 属性 > 常规 > 公共语言运行时支持 > /clr)__FUNCDNAME__ 宏不返回真正的修饰函数名称:

  • 图像内的真实函数名:?Test@@YGXPADH@Z
  • __FUNCDNAME__ 返回:?Test@@ $$F YGXPADH@Z __FUNCDNAME__ 宏不返回真正的修饰函数名。

这使得无法使用#pragma 注释指令直接从代码中导出 DLL 中的函数而无需名称修饰:

// .h
/*__declspec(dllexport)*/ void __stdcall Test(char *p1, int p2);

// .cpp
void __stdcall Test(char *p1, int p2)
{
    #pragma message("Exporting function " __FUNCTION__ " [" __FUNCDNAME__ "]")
    #pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
}

返回链接器错误 LNK1242 '?Test@@$$FYGXPADH@Z' 是无效的导出符号名称。

4

0 回答 0