0

依存関係を使用して dll からエクスポートされた関数のリストを調べていたところ、名前に奇妙なシンボルが含まれていることに気付きました。それらは次の形式です

??0Function Name@@QEAA@AEBV0@@Z

また、0 は別の数値に置き換えられる場合があります。

@@の数とアルファベットが異なります。

彼らが何を表しているのか誰にも言えますか?

4

2 に答える 2

1

これは、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++ クラスでは機能しません。

于 2012-04-11T13:02:22.767 に答える
0

状況によっては、MicrosoftがUnDecorateSymbolNameを提供しているAPIを使用して、これらの名前をプログラムで装飾解除したい場合があります。

于 2012-05-10T21:16:49.550 に答える