2012-06-16 15 views
7

可能性の重複:
What does a “CALLBACK” declaration in C do?Windows API関数宣言の "CALLBACK"は何を意味しますか?

のWindowProc()関数のプロトタイプは、この

 LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam); 

ですが、私はCALLBACKキーワードに遭遇したことがありません、私だけコールバック関数は別の関数へのポインタを渡す関数なので、ここではこのコールバックはどういう意味ですか?それは何をするのですか?

答えて

7

これはWin32 APIがコールバック関数について想定しているので、#__stdcallと定義されています。これは呼び出し規約です。関数呼び出しが低レベルでどのように配置されるか、どのようにパラメータがCPUスタックに配置されるかなどについて記述しています。期待されるスタックレイアウト(すなわち、規約)に関する仮定は、呼び出し元と呼び出し先との間で一致しなければならず、そうでないとあらゆる種類の楽しい結果が生じる可能性がある。

歴史的に、IntelのCPUでは、複数の規則がありました。マイクロソフト以外のコンパイラを数えればさらに多くのことが起こります。あなたのコールバックが__stdcallであることを確認することは良い習慣です。場合によっては、コンパイラと設定によっては、__stdcallがデフォルトの呼び出し規約(つまり、CALLBACKを安全に省略することができます)ではなく、必ずしもそうではありません。

Win16では、CALLBACKはfar pascalと定義されていました。これは、特にCプログラムでは、ユーザー関数のデフォルトではあまりありません。コールバックがパスカル呼び出し規約を持つと仮定されたという事実は、歴史的な人工物でした。

+0

正確に_stdcallは何ですか? LRESULTの戻り値の型は、_stdclallとは何ですか?どのようなポジションを占めるのか?そして、少し簡単に言えますか?コールバックは何ですか? – Ghost

+0

__stdcallは、多くの可能性のある[呼び出し規約](http://en.wikipedia.org/wiki/Calling_convention)を表します。コールバックは、APIが代わりに関数を呼び出す手法です。これを正しく行うには、APIが、関数が従う呼び出し規約を知っている必要があります。 –

+0

呼び出し規約を変更するにはどうすればよいですか?また、winproc関数も何らかの形で大会に従っています(これは理にかなっていますが、winprocが大会に接続されていることを意味するWindowsの規則をWindowsに伝えていますか?ご不便をおかけして申し訳ございませんが、私は完全に満足していません。 – Ghost

関連する問題