WINAPIとCALLBACKの穴埋め

873 ワード

コールバック関数をC++で定義する場合、次の文がよく使用されます.
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は?
  • デフォルトでは、__が使用されます.cdecl方式であるため省略することができる.
  • WINAPIは、一般に動的リンクライブラリ
  • を修飾するために使用される
  • CALLBACKはコールバック関数
  • を修飾するためにのみ使用される.
    参考文献
    [1].WINAPIとCALLBACKの2つのマクロから