我在Visual Studio 2010中编写了一个包含大量函数和类的.dll库。 当我用以下内容查看文件的内容时:
dumpbin.exe /EXPORTS myDll.dll
我使用某种函数位置指针获取长函数名,看起来像这样(.dll中的第二个条目):
2 1 0001100A ?Initialize@codec@codecX@@SANNN@Z = @ILT+5(?Initialize@codec@codecX@@SANNN@Z)
这在某种程度上难以阅读,但我从其他.dll-s看到了“更好”的程序/功能列表,如下所示:
141 8C 00002A08 PogoDbWriteValueProbeInfo
如何让那个.dll列表看起来那样?
P.S。:我的dll源代码如下所示:
namespace codecX
{
class codec
{
public:
static __declspec(dllexport) double Initialize(double a, double b);
...
答案 0 :(得分:9)
您需要将这些静态成员函数拉入全局地址空间,然后将其包装起来 外部“C”。这将抑制C ++名称修改,而是给你C名称修改,这不那么难看:
extern "C" __declspec(dllexport) Initialize(double a, double b)
{
codec::Initialize(a, b);
}
然后删除静态成员函数上的__declspec(dllexport):
class codec
{
public:
static double Initialize(double a, double b);
}
答案 1 :(得分:3)
这称为 name-mangling ,当您使用C ++编译器编译C ++时会发生这种情况。
为了保留“humand-readable”名称,在声明和定义类和函数时,必须使用extern "C"
。即。
extern "C" void myFunction(int, int);
请参阅here以及Google mixing C and C++
。
答案 2 :(得分:0)
您看到的是函数名称的C ++处理。
如果需要将该函数保留为C ++函数,则可以使用实用程序dumpbin.exe
对undname.exe
输出进行后期处理,以获得常规函数名。
Microsoft Visual Studio随附了一个实用程序,用于取消修饰名为undname.exe
的C ++杂乱函数名称。
它可以如下使用:
C:\>undname ?func1@a@@AAEXH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?func1@a@@AAEXH@Z"
is :- "private: void __thiscall a::func1(int)"