12

我在 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 列表看起来那样?

PS:我的 dll 源代码如下所示:

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

3 回答 3

10

您需要将这些静态成员函数拉入全局地址空间,然后用 extern "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);
}
于 2013-02-26T13:27:45.383 回答
4

这称为名称修改,当您使用 C++ 编译器编译 C++ 时会发生这种情况。为了保留extern "C"在声明和定义类和函数时必须使用的“人类可读”名称。IE

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

这里和谷歌mixing C and C++

于 2013-02-26T13:28:16.383 回答
0

您所看到的是函数名称的 C++ 修饰。

如果需要将此函数保留为 C++ 函数,您可以dumpbin.exe使用该实用程序对输出进行后期处理以获得正常的函数名称undname.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)"
于 2020-06-23T16:03:28.960 回答