c++ - MSVC 中的分解

标签 c++ winapi

如何在 MSVC 中分解名称? gcc 中有 abi::__cxa_demangle 函数。在 MSDN 中我找到了 UnDecorateSymbolName:

http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms681400%28v=vs.85%29.aspx

不幸的是,这个函数甚至不能取消修饰这样的符号:

#include <Windows.h>
#include <DbgHelp.h>

#include <cstdlib>
#include <iostream>
#include <typeinfo>

int main()
{
    SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);

    if (!SymInitialize(GetCurrentProcess(), NULL, TRUE))
    {
        std::cout << "SymInitialize returned error: " << GetLastError() << '\n';
        return EXIT_FAILURE;
    }

    class Foo {};
    Foo instance;

    const char* decorated_name = typeid(instance).name();
    char undecorated_name[1024];
    if (!UnDecorateSymbolName(decorated_name, undecorated_name, sizeof(undecorated_name) / sizeof(*undecorated_name), UNDNAME_COMPLETE))
    {
        std::cout << "UnDecorateSymbolName returned error: " << GetLastError() << '\n';
        return EXIT_FAILURE;
    }

    std::cout << "Decorated name: " << decorated_name << '\n'
              << "Undecorated name: " << undecorated_name << '\n';
}

输出

Decorated name: ?AVFoo@?4?main@

Undecorated name: ?AVFoo@?4?main@

如果我做错了?

我在某处听说过 _unDName 函数,但找不到任何示例。在哪个头文件中定义?

最佳答案

Visual Studio 已经发布了一个名为 undname 的实用程序。对于我的 VS2010 和 VS2013 安装,它被安装到 %VSINSTALL%\vc\bin 目录。 对于 x64 平台,在 %VSINSTALL%\vc\amd64\bin 目录。

示例用法是:

D:\work\VS2013>undname "?static_x@?1??getX@@YAAAUX@@XZ@4U2@A"
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?static_x@?1??getX@@YAAAUX@@XZ@4U2@A"
is :- "struct X `struct X & __cdecl getX(void)'::`2'::static_x"

另一种获取分解名称的方法是使用/FAsc/Faoutput.asm 编译器选项,这将生成汇编列表,其中每个分解名称都用它的分解名称进行注释。参见 This link for reference .

关于c++ - MSVC 中的分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13777681/

相关文章:

c++ - 无法在 stdafx.h 中定义

c++ - Qt:带有可移动小部件的窗口

c++ - Boost Graph 算法 - 添加约束

pointers - 如何在Go中使用Win32的GetRawInputDeviceList?

c++ - 使用 TerminateProcess 终止 "mstsc.exe"进程时出现错误代码 (5) 访问被拒绝

c++ - 在UnrealEngine中动态创建SphereComponent

c++ - 如何在 c++ 的 quickfixc 中动态地就 SenderCompID 和 TargetCompID 达成一致?

c++ - 将路径传递给 CreateProcessA

c++ - 使用 RegEnumValue 显示值名称和数据

c++ - 如何使用 IDirectManipulationViewport::SetViewportRect?