C DLL でエクスポートされた関数名を制御する方法: 装飾された関数名と装飾されていない関数名?

Patricia Arquette
リリース: 2024-11-17 01:32:03
オリジナル
657 人が閲覧しました

How to Control Exported Function Names in C   DLLs: Decorated vs. Undecorated?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート