DLL函数名使用dumpbin.exe

DLL function names using dumpbin.exe

本文关键字:dumpbin exe 函数 DLL      更新时间:2023-10-16

我在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中看到了"更好"的过程/函数列表,比如:

141   8C 00002A08 PogoDbWriteValueProbeInfo

我怎么能使。dll列表看起来那样?

注:我的DLL源代码看起来像这样:

namespace codecX
{
   class codec
   {
      public:
      static __declspec(dllexport) double Initialize(double a, double b);
      ...

您需要将这些静态成员函数拉入全局地址空间,然后用外来的"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);
}

这被称为name-mangling,在使用c++编译器编译c++时发生。为了保留"人类可读"的名称,在声明和定义类和函数时必须使用extern "C"。例如

extern "C" void myFunction(int, int); 

看这里,也谷歌mixing C and C++

你看到的是c++对函数名的混淆。

如果这个函数需要保持为c++函数,您可以使用实用程序undname.exe后处理dumpbin.exe输出以获得正常的函数名称。

随Microsoft Visual Studio提供了一个实用程序,用于取消修饰c++中被打乱的函数名,称为undname.exe

可以这样使用:

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)"