WINAPIとCALLBACKの穴埋め
873 ワード
コールバック関数をC++で定義する場合、次の文がよく使用されます.
自分で書いた方法でコールバック関数を呼び出すと、コンパイラがエラーを報告します.その後、対応するマクロ定義WINAPIがメソッドに欠けていることがわかりました.正確な定義は次のとおりです.
ここで、WINAPIとCALLBACKはwindowsが持っているマクロ定義です.
両者の本質は同じだ.stdcallは、関数パラメータが右から左の順にスタックに入ることを約束し、呼び出された関数が戻る前に転送パラメータのスタックをクリーンアップし、関数パラメータの個数が固定されるスタック呼び出し方式である.c++のデフォルトの呼び出し方法は_cdcel、このようにエラーの原因は明らかで、コールバック関数とcaller関数は異なる呼び出し方式を使用して、プログラムがコンパイルできないことを招きます.
では、いつ使いますか.cdcelと_stdcallは?デフォルトでは、__が使用されます.cdecl方式であるため省略することができる. WINAPIは、一般に動的リンクライブラリ を修飾するために使用される CALLBACKはコールバック関数 を修飾するためにのみ使用される.
参考文献
[1].WINAPIとCALLBACKの2つのマクロから
typedef void (CALLBACK *callbackfun) (param1, param2, ... , paramN)
自分で書いた方法でコールバック関数を呼び出すと、コンパイラがエラーを報告します.その後、対応するマクロ定義WINAPIがメソッドに欠けていることがわかりました.正確な定義は次のとおりです.
void WINAPI caller(callbackfun myfun1, param2, ... , paramN)
ここで、WINAPIとCALLBACKはwindowsが持っているマクロ定義です.
#define CALLBACK __stdcall
#define WINAPI __stdcall
両者の本質は同じだ.stdcallは、関数パラメータが右から左の順にスタックに入ることを約束し、呼び出された関数が戻る前に転送パラメータのスタックをクリーンアップし、関数パラメータの個数が固定されるスタック呼び出し方式である.c++のデフォルトの呼び出し方法は_cdcel、このようにエラーの原因は明らかで、コールバック関数とcaller関数は異なる呼び出し方式を使用して、プログラムがコンパイルできないことを招きます.
では、いつ使いますか.cdcelと_stdcallは?
参考文献
[1].WINAPIとCALLBACKの2つのマクロから