使用dumpbin.exe的DLL函数名称

Tom*_*miL 8 c++ windows dll visual-studio-2010

我在visual studio 2010中编写了一个包含大量函数和类的.dll库.当我查看文件的内容时:

dumpbin.exe /EXPORTS myDll.dll
Run Code Online (Sandbox Code Playgroud)

我用一些函数位置指针得到很长的函数名,看起来像这样(.dll中的第二个条目):

          2    1 0001100A ?Initialize@codec@codecX@@SANNN@Z = @ILT+5(?Initialize@codec@codecX@@SANNN@Z)
Run Code Online (Sandbox Code Playgroud)

这在某种程度上难以阅读,但我从其他.dll-s看到了"更好"的程序/功能列表,如下所示:

141   8C 00002A08 PogoDbWriteValueProbeInfo
Run Code Online (Sandbox Code Playgroud)

我怎么能让那个.dll列表看起来那样?

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

namespace codecX
{
   class codec
   {
      public:
      static __declspec(dllexport) double Initialize(double a, double b);
      ...
Run Code Online (Sandbox Code Playgroud)

Joh*_*lén 9

您需要将这些静态成员函数拉入全局地址空间,然后使用extern"C"包装它们.这将抑制C++名称修改,而是给你C名称修改,这不是那么难看:

extern "C" __declspec(dllexport) Initialize(double a, double b)
{
    codec::Initialize(a, b);
}
Run Code Online (Sandbox Code Playgroud)

然后删除静态成员函数上的__declspec(dllexport):

class codec
{
    public:
        static double Initialize(double a, double b);
}
Run Code Online (Sandbox Code Playgroud)


bas*_*h.d 5

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

extern "C" void myFunction(int, int); 
Run Code Online (Sandbox Code Playgroud)

请参阅此处以及谷歌mixing C and C++