首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dumpbin.exe的DLL函数名

使用dumpbin.exe的DLL函数名
EN

Stack Overflow用户
提问于 2013-02-26 13:21:49
回答 3查看 31.9K关注 0票数 12

我在visual 2010中编写了一个包含大量函数和类的.dll库。当我使用以下方法查看文件的内容时:

代码语言:javascript
复制
dumpbin.exe /EXPORTS myDll.dll

使用某种函数位置指针获得长函数名,它看起来如下(.dll中的第二个条目):

代码语言:javascript
复制
          2    1 0001100A ?Initialize@codec@codecX@@SANNN@Z = @ILT+5(?Initialize@codec@codecX@@SANNN@Z)

这在某种程度上很难理解,但我从其他..dll s中看到了“更好的”过程/函数列表,如下所示:

代码语言:javascript
复制
141   8C 00002A08 PogoDbWriteValueProbeInfo

我怎样才能让.dll列表看起来那样呢?

P.S.:我的dll源代码如下所示:

代码语言:javascript
复制
namespace codecX
{
   class codec
   {
      public:
      static __declspec(dllexport) double Initialize(double a, double b);
      ...
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-26 13:27:45

您需要将这些静态成员函数拉到全局地址空间中,然后用extern "C“包装它们。这将抑制C++名称的损坏,而不是给C名称mangling,它不那么难看:

代码语言:javascript
复制
extern "C" __declspec(dllexport) Initialize(double a, double b)
{
    codec::Initialize(a, b);
}

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

代码语言:javascript
复制
class codec
{
    public:
        static double Initialize(double a, double b);
}
票数 11
EN

Stack Overflow用户

发布于 2013-02-26 13:28:16

这称为name-mangling,当您用C++编译器编译C++时就会发生这种情况。为了保留“humand可读”名称,在声明和定义类和函数时,必须使用extern "C"。即

代码语言:javascript
复制
extern "C" void myFunction(int, int); 

请参阅这里和google mixing C and C++

票数 5
EN

Stack Overflow用户

发布于 2020-06-23 16:03:28

您所看到的是C++对函数名的损坏。

如果需要将此函数保留为C++函数,则可以使用实用工具undname.exedumpbin.exe输出进行后处理以获得正常的函数名。

与Microsoft一起提供的实用程序用于卸载C++损坏的函数名,称为undname.exe

它可用于以下方面:

代码语言:javascript
复制
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)"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15090196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档