Как декорировать имя из украшенного имени? - PullRequest
10 голосов
/ 07 февраля 2012

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 07 февраля 2012

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

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

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

7 голосов
/ 07 февраля 2012

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

В статье, которую вы связали, Рэймонд использует утилиту MS (undname) для удаления искажения.

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

4 голосов
/ 27 июля 2012

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 @ UILibrary @@ UAEPB_WPAPAVStringHolder @ 2 @@ Z

Microsoft (R) C ++ Name Undecorator Авторское право (C) Microsoft Corporation. Все права защищены.

Декодирование: - "? GetName @ PushButton @ UILibrary @@ UAEPB_WPAPAVStringHolder @ 2 @@ Z" is: - "public: virtual wchar_t const * __thiscall UILibrary :: PushButton :: GetName (класс UILibrary :: StringHolder * *) «

...