C DLL エクスポート: 装飾名/マングル名について
C では、エクスポートされた関数を含む DLL を作成するときに、装飾名やマングル名が発生するのが一般的です。コンパイル後の名前。これらは、予期される装飾されていない関数名とは異なるため、混乱を招く可能性があります。
なぜ装飾名があるのですか?
関数名の装飾は、コンパイラによって使用されるメカニズムです。関数のシグネチャが一意であること。これは、複数の関数の名前が同じでパラメータが異なる場合に特に重要です。装飾には、関数の呼び出し規約、パラメーターの型、その他の属性に関する情報が含まれます。
モジュール定義ファイルと "C" スタイル エクスポート
両方ともモジュール定義を使用ファイル (.def) とエクスポートの "C" スタイル (extern "C" __declspec(dllexport)) により、装飾された名前が発生する可能性があります。これは、どちらも基盤となる Windows PE 形式を使用しており、エクスポートされた関数には装飾名が必要であるためです。
装飾名の削除
「」の後の装飾名を削除するには=" の場合は、#pragma comment(linker) ディレクティブを使用できます。これにより、エクスポートされた関数名と、それが解決される装飾名を指定できます。
例:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
または、関数本体内で次のコードを使用して、装飾されたname:
#pragma comment(linker, "/EXPORT:\"" __FUNCTION__ "\"=\"" __FUNCDNAME__ "\"")
結論
装飾名は Windows PE 形式に固有の部分です。 #pragma comment(linker) ディレクティブを使用すると、エクスポートされた関数名とそれが解決される装飾名を指定でき、エクスポートされた関数が dumpbin.exe 出力にどのように表示されるかを制御できます。
以上がC DLL でエクスポートされた関数名を制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。