Как undecorate имя от украшенного имени?

на посту Раймонда Чена, Он, кажется, может знать неотделанное имя функции от украшенного имени. Я понятия не имею, как он мог это сделать.

в этом украшенном имени,

?GetName@PushButton@UILibrary@@UAEPB_WPAPAVStringHolder@2@Z

Что означает каждый компонент?

3 ответов


чтобы не гадать, и не использовать инструменты UndecorateSymbolName функции может пригодиться. Я надеюсь, что это дает авторитетный правильный ответ.

сделать это вручную, на этой странице имеет некоторую информацию о схеме, как и эти.

основной контур _name@scope@scope@@parameters@something@@something. Я подозреваю, что последние две части-это размер стека и соглашение о вызове или подобное, но документация, вероятно, имеет более подробную информацию.


искажение имени зависит от компилятора.

в статье, которую вы связали, Raymond использует MS util (undname) для удаления искажения.

таблица показывает, как часто компиляторы калечат.


Microsoft Visual Studio поставляется с undname.инструмент exe.

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

Если у вас есть MS VS по умолчанию, вы можете использовать:

"C:\Program файлы (x86)\Microsoft Visual Studio 10.0\VC\bin\undname.exe"?GetName@PushButton@UILibrary@@UAEPB_WPAPAVStringHolder@2@Z

Microsoft (R) C++ Имя Undecorator Copyright (C) Корпорация Майкрософт. Все права зарезервированный.

Undecoration of: -"?Метод getname@кнопка@UILibrary@@UAEPB_WPAPAVStringHolder@2@@Z" это :- "общественный: виртуальный константный тип wchar_t * __thiscall UILibrary::кнопки::метод getname(UILibrary класс::StringHolder * *)"