8

サードパーティアプリケーション用のDLLを作成しています。メインのソフトウェアエンジニアは、アプリケーションが__cdecl(/ Gd)呼び出し規約を使用していると述べています。私はそれを使用することを確認する必要があります。

さらに、サードパーティは、次のように関数をエクスポートするC++DLLスケルトンを提供してくれました。

#ifdef _EXPORTING
  #define DECLSPEC    __declspec(dllexport)
#else
   #define DECLSPEC    __declspec(dllimport)
#endif

#ifdef __cplusplus
   extern "C" {  
#endif

DECLSPEC int ICD_Create(char* id);
....
....

ちょっと混乱しています。関数が__cdedlではなく__declspec規則を使用してエクスポートされるのはなぜですか?__declspecは_cdeclをサポートしていますか?

ありがとう。

4

2 に答える 2

15

__declspec()そして__cdecl、関数を呼び出す2つの異なる側面に取り組んでおり、両方を使用できます(この場合はその音によって)。

__cdecl呼び出し規約を指定します。これは、パラメーターがスタックを介して関数に渡される方法を指定し、非常に重要なこととして、後でスタックをクリーンアップする人を指定します(この場合、__cdecl片付けるのは呼び出し元です)。

__declspec(dllimport/dllexport)DLLからの関数定義のエクスポートを簡素化するために使用されます。それらを使用する必要はありませんが、関数をエクスポートする他の方法は非常に扱いにくいです。

__cdecl呼び出し規約を選択するのにコンパイラーに依存しているコードスニペットを実行するのではなく、明示的に使用することをお勧めします。私が思うに、これはコマンドラインスイッチでオーバーライドできます。デフォルトは、CコードとC ++コードのどちらをコンパイルするかによって異なると思います。したがって、(通常どおり)より明示的な方が適しています。

于 2011-08-02T16:13:29.267 に答える
9

これらは直交する概念です。 __declspec問題のエンティティの「ストレージクラス」を示すだけです。あなたが見ている文脈では、インポートまたはエクスポートの関数を指定しているかどうかを示しています(これは通常、DLLの一部としてビルドされるか、実行可能ファイルに直接含まれる可能性のあるコードを操作するときに問題になります。コンテクスト)。

詳細について__declspecは、こちらをご覧ください。

__cdecl呼び出し規約は、関数がパラメーターを渡すために従来の「C」言語の規約を使用することを示しています。特に、他のスタイルがあります__stdcall

__cdeclvs __stdcall(およびその他)の詳細はこちらです。

于 2011-08-02T16:16:27.700 に答える