使用dumpbin.exe的DLL函数名称

时间:2013-02-26 13:21:50

标签: c++ windows visual-studio-2010 dll

我在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);
      ...

3 个答案:

答案 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.exeundname.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)"