Hello, world の解説 ~ WINAPI とは何か? __stdcall の説明
おや? WINAPI ってなんだ?
今回は前節に続いて、以下の単純なソースコードを詳しく見てみましょう。
今回は WINAPI というキーワードを取り上げます。
よ~く、以下のコードを見てください。
WinMain という関数名の前に、WINAPI というキーワードが書いてありますね?
#include <windows.h> int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MessageBox( NULL, TEXT("Hello, world!"), TEXT("Hello"), MB_OK | MB_ICONINFORMATION ); return 0; }
C 言語の単純なコードを書いていて、通常この位置には何も書かないですよね?
それが、Windows プログラムの場合はここに WINAPI というキーワードが入ってきます。
これは一体どういうものでしょうか?
どうして必要なのでしょうか?
WINAPI は __stdcall という「呼び出し規約」
WINAPI は Windows SDK に含まれるヘッダファイル WinDef.h にて __stdcall として定義されています。
WinDef.h を実際に開いてみてみると、次のように定義されていることがわかります。
... #elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) #define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall #else ...
__stdcall は Windows API で広く使われている呼び出し規約 (calling convention) です。
WinMain 関数の前に WINAPI (__stdcall) というキーワードをつけることによって、 ここで作成した WinMain 関数の呼び出しを __stdcall にしています。
では、呼び出し規約とはなんでしょうか?
呼び出し規約は、ざっくり言えば、 「コードの "呼び出し側" と "呼び出される側" で、パラメータ等をどうやって受け渡しするか決めた決まりごと」 です。
これでは、なかなかピンとこないかもしれませんね。
それを理解するには、そもそも関数を呼び出すということがどういうことか、理解しなければなりません。