依存関係を使用して dll からエクスポートされた関数のリストを調べていたところ、名前に奇妙なシンボルが含まれていることに気付きました。それらは次の形式です
??0Function Name@@QEAA@AEBV0@@Z
また、0 は別の数値に置き換えられる場合があります。
@@の数とアルファベットが異なります。
彼らが何を表しているのか誰にも言えますか?
これは、C++ コンパイラによって修飾された C++ 識別子の名前です。Visual Studio コマンド プロンプトから undname.exe ユーティリティを実行して、元の C++ 宣言に戻すことができます。
C:\>undname ??0Foo@@QEAA@AEBV0@@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "??0Foo@@QEAA@AEBV0@@Z"
is :- "public: __cdecl Foo::Foo(class Foo const & __ptr64) __ptr64"
これにより、64 ビット コードにコンパイルされた Foo クラスのコピー コンストラクターになります。私が知っている正確な装飾アルゴリズムは文書化されていません。一般に、C++ がオーバーロードをサポートするために必要なリンカ シンボルの衝突を避けるために、名前の装飾が使用されます。を使用して装飾を抑制することはできますがextern "C"
、C++ クラスでは機能しません。
状況によっては、MicrosoftがUnDecorateSymbolNameを提供しているAPIを使用して、これらの名前をプログラムで装飾解除したい場合があります。