11

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';
}

出力

装飾名:?AVFoo @?4?main @

装飾されていない名前:?AVFoo @?4?main @

私が間違っている場合は?

_unDName関数についてどこかで聞いたことがありますが、その例は見つかりません。どのヘッダーファイルで定義されていますか?

4

4 に答える 4

18

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 コンパイラ オプションを使用することです。これにより、アセンブリ リストが生成されます。このリストでは、それぞれのマングルされた名前がデマングルされた名前でコメントされます。参照用にこのリンクを参照してください

于 2014-04-27T02:52:42.463 に答える
1

UndecorateSymbolName も期待どおりに機能しません。構造体またはクラスのメンバーを反復処理する場合は、ブースト フュージョンを使用して C++ でリフレクションを実装します。

于 2013-10-26T10:48:32.497 に答える