- ベストアンサー
WINAPIとAPIENTRYの使い分け
表題の通りです。 WINAPIとAPIENTRYは__stdcallで定義されていることは知っていますが、 そもそも、この二つはどのような目的で使用されるものなのかが分かりません。 どのような目的があって、このようなものが定義されたのか、 そしてどのように使い分ければいいのかを知りたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
一つの理由としては、Windows SDKの関数の役割や意味づけを示しています。 WINAPIはWin32APIの関数である、ということを示しているだけです。 基本的に自分で書くコードの関数にWINAPIを付けるのは意味的にはよろしくないでしょうね。 別に害は無いと思いますが。 APIENTRYはWinMain関数とかDllMain関数の定義につけるものですね。 この二つの関数は、Win32APIの仕様として引数や返すべき戻り値は決まっているものの、ユーザーが定義しプログラムの最初に呼ばれる特殊な関数(エントリー関数)ですので別に定義しているだけだと思います。 (昔はリファレンスのサンプルでもWinMainの定義はWINAPIだったと思うんですけど) この他にも、例えばメッセージプロシージャなどのコールバック関数を定義するときはCALLBACKを付けますが、これも実体は__stdcallです。 もう一つの理由もあります。 もし各APIが__stdcallで直接宣言されていたとしましょう。 そして、Win32APIの仕様が変更になって呼び出し規約がstdcallから別のものに変更されたとします。(まずありえないと思いますが) この場合、数万行あるとも言われるwindows.h及び関連ヘッダの全ての関数宣言も書き換えるという大変更が生じます。 それだけではなく、windows.hはあらゆるWindowsアプリケーションがインクルードし依存していますから、これはマイクロソフトだけで収まる問題ではなく、世界規模での問題になることは必至です。 しかし、マクロ定義されていればWINAPIの一カ所を修正するだけで済みます。 少なくとも、ヘッダ丸々書き換えるよりは手間も影響も少ない、という事を見越しての事です。
お礼
なるほどAPIENTRYのENTRYってエントリポイントのことを言っていたんですね。 納得がいきました。ありがとうございます。