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 にしています

では、呼び出し規約とはなんでしょうか?

呼び出し規約は、ざっくり言えば、 「コードの "呼び出し側" と "呼び出される側" で、パラメータ等をどうやって受け渡しするか決めた決まりごと」 です。

これでは、なかなかピンとこないかもしれませんね。

それを理解するには、そもそも関数を呼び出すということがどういうことか、理解しなければなりません。

結局、関数を呼び出すということ »

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説