慣習を呼びます
手順または関数を宣言する場合、次の指標のいずれかを使用して、登録、Pascal、CDECL、STDCALL、およびSafeCallの呼び出し条約を示すことができます。例えば、
function myFunction(x、y:real):real;
...
呼び出し規則は、パラメーターがルーチンに渡される順序を決定し、スタックからパラメーターを削除し、パラメーターを渡す、エラーと例外処理を削除するときにレジスタの使用にも影響します。デフォルトの呼び出しコンベンションは登録です。
•登録およびPascalは、左から右へのパスパラメーター、つまり、左端のパラメーターが最も早く計算および渡され、最終的にCDECL、STDCALL、SAFECALLパラメーターが右から左に渡されます。
•CDECL呼び出しに加えて、手順と関数は、戻る前にスタックからパラメーターを削除しますが、CDECLはコールが返されると、発信者がスタックからパラメーターを削除します。
•レジスタコールは、最大3つのCPUレジスタを使用してパラメーターを渡すことができますが、他の呼び出しはすべてスタックを使用してパラメーターを渡すことができます。
•SafeCallコールは、Windowsの下でのプロセス間COMエラー通知を実装する例外「ファイアウォール」を実装します。
次の表は、呼び出しの規則をまとめたものです。
-------------------------------------------------------------- -------------------------------------------------------
-indicator単語------------------------------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ---? |
-register ---------------左から右----------ルーチン-----------------はい---------------------- ||
-pascal --------------左から右----------ルーチン-------------------- ---------------------------- |
-cdecl -----------------左から----------発信者---------------------------------------------------------------------------------------- ---いいえ------------------------------ |
-stdcall ---------------左から右---------ルーチン----------------------------------------------------------------------------------------------------------- ---いいえ---------------------------- |
-safecall --------------左から右---------ルーチン----------------------------------------------------------------------------- ---いいえ------------------------ |
-------------------------------------------------------------- ----------------------------------------------------------
通常、c/c ++で書かれた共有ライブラリからの関数を呼び出す場合、通常、レジスタはスタックフレームの作成を避けるため、最も効率的です。 stdcallとsafecallが推奨されます。 Windowsでは、System APIはSTDCALLとSAFECALLを使用しますが、他のオペレーティングシステムは通常CDECLを使用しています(STDCALLはCDECLよりも効率的であることに注意してください)。
デュアルインターフェイスを宣言する方法は、SafeCallを使用する必要があります。通話条約の詳細については、プログラム制御を参照してください。
16ビットのWindowsプログラミングでは、近く、遠く、エクスポートが使用されており、32ビットプログラムには影響がなく、後方互換性のために保持されます。