如何从修饰名称中取消修饰名称

How to undecorate name from decorated name?

本文关键字:取消      更新时间:2023-10-16

在Raymond Chen的帖子中,他似乎能够从修饰的名称中知道函数的未修饰名称。我不知道他怎么会这么做。

在这个装饰的名字中,

GetName@PushButton@UI库@@UAEPB_WPAPAVStringHolder@2@@Z

每个组件是什么意思?

为了避免猜测,并且仍然不真正使用工具,UnDecorateSymbolName函数可能很有用。我希望这能给出一个权威的正确答案。

要手动执行此操作,此页面包含一些有关方案的信息,这些信息也是如此。

基本轮廓是_name@scope@scope@@parameters@something@@something。我怀疑最后两部分是堆栈大小和调用约定或类似内容,但文档可能有更多细节。

名称篡改依赖于编译器。

在您链接的文章中,Raymond使用MSutil(undname)来删除损坏。

下面的表格显示了常见的编译器是如何崩溃的。

Microsoft Visual Studio附带了undname.exe工具。

http://msdn.microsoft.com/en-us/library/ms937379.aspx

如果你在默认位置有MS VS,你可以使用:

"C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\bin\undname.exe"GetName@PushButton@UI库@@UAEPB_WPAPAVStringHolder@2@@Z

Microsoft(R)C++名称取消装饰器版权所有(C)Microsoft Corporation。保留所有权利。

取消装饰:-";?GetName@PushButton@UI库@@UAEPB_WPAPAVStringHolder@2@@Z";是:-";public:virtual wchar_t const*__thiscall UILibrary::PushButton::GetName(类UILibrary::StringHolder**)"