Hello, world のまとめ
前回までの解説で、WinMain を読み解く基礎体力は出来ました。
今回はいよいよ、Hello, world プログラムを見ていきましょう!
また繰り返しになりますが、説明するコードはこちらです。
#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; }
前回のおさらいを兼ねて、このコードを上から順番に見ていきましょう。
#include <windows.h>
Windows プログラムの基本のヘッダファイルは windows.h です。 これまでに見てきた、各種キーワード類は windows.h を取り込むことによって利用可能になります。 これは常にインクルードしてよいでしょう。
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ... return 0; }
続いて現れているのは WinMain です。これはデフォルトのエントリポイントでしたね。 Windows プログラムはここからプログラムが開始します。
あやふやな人は 「WinMain とは何か?」 を読み返してみてください。
WinMain に渡される引数の意味は次のようになります。
型 | 説明 | |
---|---|---|
HINSTANCE | hInstance | 現在のインスタンスのハンドル。ハンドルというのは聞き慣れない言葉かもしれませんが、識別子という程度の意味で考えておいて良いと思います。 |
HINSTANCE | hPrevInstance | 以前のインスタンスのハンドル。常に NULL。つまり使われません。 |
LPSTR | lpCmdLine |
コマンドライン文字列を取得します。 ただし型が LPSTR、すなわち char* になります。ワイドキャラクタをサポートしていません。Unicode ビルドにも対応する場合には、 GetCommandLine API を利用しましょう。これは LPTSTR を返すので、ANSI ビルド、Unicode ビルド両方に対応させることが出来ます。 |
int | nCmdShow | ウィンドウの開き方を示します。これは今回のようにウィンドウをもたないプログラムの場合は利用しません。 |
WinMain が返す値は次のようになります。
値 | 意味 |
---|---|
0 | メインスレッドがメッセージループに入らずに終了する場合、WinMain は 0 を返します。 |
QUIT メッセージの wParam 値 | メッセージループから抜けて WinMain が終了する場合、WinMain は QUIT メッセージの wParam 値を返します。 これはウィンドウを持つプログラムを作るときに説明します。 |
WinMain を開始すると、本プログラムは直ちに MessageBox API を呼び出してメッセージボックスを表示します。
MessageBox( NULL, TEXT("Hello, world!"), TEXT("Hello"), MB_OK | MB_ICONINFORMATION );
MessageBox 関数へのパラメータは次のようになります。
型 | 意味 | |
---|---|---|
HWND | hWnd | 親ウィンドウのハンドル。親ウィンドウが無い場合は NULL を渡す。 |
LPCTSTR | lpText | 表示するメッセージ。 |
LPCTSTR | lpCaption | メッセージボックスのキャプション。 |
UINT | uType |
アイコンとボタンを指定する。 アイコンとボタンの種類は || (OR) を使って、複数各種組み合わせることが可能です。詳細は MSDN MessageBox を参照してください。 |
表示テキストとキャプションは、LPCTSTR 型で指定するために TEXT マクロで囲ってあります。 これによって、TEXT("Hello") は Unicode ビルドのときに、L"Hello"、 ANSI ビルドのときに "Hello" に解釈されるのでしたね。
メッセージボックスで表示するボタンは [OK] のみ。かつ、表示するアイコンは情報アイコン。 このために、MB_OK | MB_ICONINFORMATION を指定してあります。この結果、下記のようなメッセージボックスになります。
尚、アイコンのルックアンドフィール (みた感じ) は、Windows のバージョンによってそれぞれ異なった雰囲気のものが表示されます。 つまり、上図は Windows Vista のルックアンドフィールですが、同じプログラムを Windows XP や Windows 2000 で実行した場合は、 それぞれ OS が持つルックアンドフィールのメッセージボックスが表示されることになります。
最後に、WinMain 関数が上で説明したように戻り値として 0 を返してプログラムは終了します。
非常に単純なプログラムですが、いかがでしたでしょうか。
徐々に複雑なプログラムにしていきましょう。