ホームページ  >  記事  >  バックエンド開発  >  C DLL でエクスポートされた関数名を制御するにはどうすればよいですか?

C DLL でエクスポートされた関数名を制御するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-17 12:45:02792ブラウズ

How Do I Control Exported Function Names in C   DLLs?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。