更改DEF文件中的函数签名

时间:2015-07-07 07:49:53

标签: c++ visual-studio visual-c++ dll name-mangling

我正在更改将在dll中导出的函数的签名。

DEF文件:

...
??0CLimitOrderBase@Base@@QEAA@H@Z
?foo@CLimitOrderBase@Base@@UEAAHAEAVCLimitInfo@2@@Z
...

代码将从

更改
namespace Base {

class CLimitOrderBase : public CLimit
{
    ...
    virtual BOOL foo(CLimitInfo &limitInfo);
    ...
};

virtual BOOL foo(CLimitInfo &limitInfo, bool bCheck = false);

如何在DEF文件中更改新的受损名称?

2 个答案:

答案 0 :(得分:1)

将以下内容添加到头文件中,其中包含DLL中的每个其他头文件(使用有意义的内容重命名YOURDLL):

#ifdef YOURDLL_EXPORTS
#define YOURDLL_API __declspec(dllexport)
#else
#define YOURDLL_API __declspec(dllimport)
#endif

然后按照此示例声明导出的类:

class YOURDLL_API CLimitOrderBase : public CLimit
{
    ...
    virtual BOOL foo(CLimitInfo &limitInfo);
    ...
};

最后,在DLL项目中定义YOURDLL_EXPORTS(属性 - > C / C ++ - >预处理器下的预处理器定义字段)。 这样您就不需要手动编辑.DEF文件。

答案 1 :(得分:0)

使用dllexport是一个好主意,但目前我只是更改了现有大型DEF文件的一个功能,.def vs _declspec(dllexport)超出了这个主题。

感谢Hans Passant的评论,我终于弄明白了如何从Visual Studio中获取错误的C ++函数名称(对于g ++,请参考this answer。)

  1. 生成.map文件:
    • 在VS中,打开项目的“属性页”对话框
    • 点击Linker文件夹
    • 点击Debug属性页
    • 修改Generate Map File属性。
  2. 重建项目。
  3. 打开生成 .map文件,搜索函数名称。
  4. 将新修改的名称复制到.def文件