2012-04-11 4 views
0

Я просматривал список функций, которые были экспортированы из dll, используя depend и я заметил некоторые странные символы, включенные в имена. Они имеют форматЭкспорт Функции DLL, если смотреть, зависит от

??0Function [email protected]@[email protected]@@Z

Кроме 0, может быть заменен каким-либо другим номером.

Число @@ и алфавитов различаются.

Можно ли сказать, что они представляют?

ответ

1

Это имя идентификатора C++, который был украшен компилятором C++. Вы можете запустить утилиту undname.exe из визуальной строки студии Command, чтобы преобразовать его обратно в исходную декларацию C++:

C:\>undname [email protected]@[email protected]@@Z 
Microsoft (R) C++ Name Undecorator 
Copyright (C) Microsoft Corporation. All rights reserved. 

Undecoration of :- "[email protected]@[email protected]@@Z" 
is :- "public: __cdecl Foo::Foo(class Foo const & __ptr64) __ptr64" 

Что делает его конструктор копирования для класса Foo, компилируется в 64-битный код. Точный алгоритм декорирования не документирован, о котором я знаю. В целом, украшение имен используется, чтобы избежать столкновений символьных символов, что необходимо, потому что C++ поддерживает перегрузку. Вы можете подавить украшение, используя extern "C", но это не может работать на классе C++.

0

В некоторых ситуациях вам может быть интересно разметить эти имена программно с помощью API, предоставляющего Microsoft UnDecorateSymbolName.

Смежные вопросы