ホームページ >バックエンド開発 >C++ >C DLL でエクスポートされた関数名が装飾される場合があるのはなぜですか? 装飾されていない名前をエクスポートするにはどうすればよいですか?

C DLL でエクスポートされた関数名が装飾される場合があるのはなぜですか? 装飾されていない名前をエクスポートするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-12 09:30:02731ブラウズ

Why are C   DLL exported function names sometimes decorated, and how can I export undecorated names?

C DLL エクスポート: 装飾された/マングルされた名前

C DLL 開発では、エクスポートされた関数名がコンパイル後に装飾されずに表示されることが期待されます。ただし、追加の文字を含む装飾された関数名に遭遇すると、懸念が生じる可能性があります。

装飾の原因

表示される装飾は、コンパイラの名前マングリング プロセスの結果です。 C コードをコンパイルするとき、コンパイラは関数名を変更して、オーバーロードされた関数または異なるコンパイル単位間で一意性を確保します。このマングリングには追加の文字と記号が含まれます。

プラグマ コメントを使用した解決策

モジュール定義ファイルを使用せずに、装飾されていない関数名をエクスポートするには、プラグマ コメントを挿入できます。

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

装飾された関数名を自動的に取得するには:

#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)

宣言指定子を使用した同等の Extern "C"

別のアプローチextern "C" を宣言指定子とともに使用することです:

extern "C" void __declspec(dllexport) SomeFunction();

ただし、この方法でも同じ修飾された関数名が生成されます。

後置の削除

残念ながら、モジュール定義ファイルやプラグマコメントを使用しない限り、ポストの「=」装飾を削除することはできません。この接尾辞は、関数の修飾されたバージョンを示します。

C# アプリケーションの回避策

修飾されていない名前が推奨されますが、C# での P/Invoke 呼び出しは引き続き次の方法で行うことができます。修飾された関数名。そのためには、関数を呼び出すときに完全に装飾された名前を含めます。

以上がC DLL でエクスポートされた関数名が装飾される場合があるのはなぜですか? 装飾されていない名前をエクスポートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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