C DLL のエクスポート: 装飾された名前と装飾されていない名前
C DLL から関数をエクスポートするときに、装飾された (壊れた) 名前が発生する可能性があります。この動作は、C でシンボル名を解決するためのコンパイラの名前マングリング メカニズムから発生します。
モジュール定義ファイル (.def)
モジュール定義ファイルを使用する場合、エクスポートされた関数の名前を明示的に指定しています。ただし、コンパイラはエクスポートされたシンボル名に装飾された接尾辞を追加します。これは関数名のマングルされたバージョンで、関数の引数、戻り値の型、その他の詳細に関する情報が含まれています。
extern "C" Export
関数のエクスポート「extern "C"」構文を使用すると、コンパイラーによる関数名の名前マングリングが防止されます。ただし、「=」の後の追加のサフィックスは削除されません。
Pragma Comment
関数を明示的にエクスポートする別の方法は、#pragma comment リンカーを使用することです。指令。このディレクティブを使用すると、エクスポートする装飾された関数名を指定できます。例:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
このディレクティブは、指定された装飾名を使用して "SomeFunction" 関数をエクスポートするようにリンカーに指示します。
FUNCTION マクロ
もう 1 つのオプションは、関数の本体内で FUNCTION マクロを使用することです。このマクロは、装飾されていない関数名に展開されます。次に、プラグマ コメント ディレクティブを使用して、次のように装飾名を持つ関数をエクスポートできます。
#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
この手法を使用すると、明示的に指定せずに装飾名を指定できます。
Byこれらのアプローチのいずれかに従えば、エクスポートされる関数名を制御し、.def ファイルまたは「extern "C"」構文を使用するときに表示される可能性がある不要な「=」や装飾されたサフィックスを回避できます。
以上がC DLL でエクスポートされた関数名を制御する方法: 装飾された関数名と装飾されていない関数名?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。