Unmangle C ++ DLL函数名称

时间:2012-05-04 21:48:13

标签: c

我有一个导出3个功能的dll:

.h文件

extern "C"
{
__declspec(dllexport) BOOLEAN __stdcall InitializeChangeNotify(void);
__declspec(dllexport) BOOLEAN __stdcall PasswordFilter(LPCWSTR AccountName,LPCWSTR FullName,LPCWSTR Password,BOOLEAN SetOperation);
__declspec(dllexport) NTSTATUS __stdcall PasswordChangeNotify(LPCWSTR UserName,ULONG RelativeId,LPCWSTR NewPassword);
}

.c文件

extern "C"
{
    __declspec(dllexport) BOOLEAN __stdcall InitializeChangeNotify(void)
{
    writeToLog("InitializeChangeNotify()");
    return TRUE;
}

__declspec(dllexport) BOOLEAN __stdcall PasswordFilter(LPCWSTR AccountName,LPCWSTR FullName,LPCWSTR Password,BOOLEAN SetOperation)
{
    writeToLog("PasswordFilter()");
    return TRUE;
}

__declspec(dllexport) NTSTATUS __stdcall PasswordChangeNotify(LPCWSTR UserName,ULONG RelativeId,LPCWSTR NewPassword)
{
    writeToLog("PasswordChangeNotify()");
    return 0;
}
}

我在VS 2010中编译。

我看到函数名称取决于:_InitializeChangeNotify@0, _PasswordChangeNotify@12。如何取消功能?

3 个答案:

答案 0 :(得分:5)

在Windows上看起来undname.exe似乎是“c++filt”。

我在我的电脑中"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\undname.exe"下了。

从页面

您可以使用undname.exe将装饰名称转换为未修饰的表单。例如,

C:\>undname ?func1@a@@AAEXH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation 1981-2000. All rights reserved.Undecoration
of :- "?func1@a@@AAEXH@Z"
is :- "private: void __thiscall a::func1(int)"

答案 1 :(得分:1)

_xxx @ x表示这是__stdcall调用约定。数字后面的@ mean参数汇总大小,以字节为单位。

答案 2 :(得分:0)

我也遇到过这个问题,并通过指定一个def文件来解决它。 e.g:

a.def:

EXPORTS

InitializeChangeNotify

在项目设置中,设置链接>>输入>>模块定义文件到a.def 并重建。 HTH