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