__stdcall
Microsoft 固有の仕様 →
__stdcall の呼び出し規約が Win32 API 関数の呼び出しに使用されます。呼び出し先がスタックを消去します。つまりコンパイラは vararg の関数 __cdecl を作成します。この呼び出し規約を使用する関数は関数プロトタイプが必要です。
return-type __stdcall function-name[(argument-list)]
解説
次の一覧は呼び出し規約の実装を示します。
要素 |
実装 |
---|---|
順序引数を渡します。 |
右から左。 |
規則引数を渡します。 |
値に応じてポインターまたは参照型を渡す。 |
スタック保守の役割 |
呼び出される関数はスタックからその引数をポップされます。 |
名前の装飾規約 |
アンダースコア (_) は名前のプレフィックスとして付けられます。名前は引数リストのバイト数 (10 進) 前にアット マーク (@) を指定します。したがってint func(int a, double b) として宣言された関数は次のように飾られます : _func@12 |
ケースの変換規則 |
なし |
/Gz コンパイラ オプションを明示的に別の呼び出し規約で宣言されていないすべての関数に __stdcall を指定します。
関数と同じ方法で宣言した __stdcall の修飾子の戻り値を使用して宣言された関数 __cdecl を使用します。
IPF (Itanium Processor Family) と x64 (IPF) プロセッサでは__stdcall はコンパイラによって受け付けられ無視 ; では名前付け規則ではパラメーターはレジスタに渡されます。
静的でないクラスの関数の場合関数が定義されているとに EOF ラインである場合は呼び出し規約の修飾子はアウトに EOF ライン定義で指定する必要はありません。つまりクラスの非静的なメンバーのメソッドごとに宣言時に指定された呼び出し規約は定義時に使用されます。このクラスを指定すると定義
struct CMyClass {
void __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
これと同じです。
void __stdcall CMyClass::mymethod() { return; }
使用例
次の例ではstdcall して標準の呼び出しはWINAPI のすべての関数型が生成されます :
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);