画面にメッセージを表示する簡単なプログラムを見ていきます。
main.c
#include <windows.h>
int APIENTRY wWinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR ipCmdLine,
_In_ int nCmdShow
) {
return MessageBox(NULL, TEXT("hello, world"), TEXT("日本"), MB_OK);
}
01行目
#include <windows.h>について
windows.hはWindows APIを使ってWindowsアプリケーションを作成するために必要なヘッダファイルです。
03行目
int APIENTRY wWinMain関数について
wWinMain関数は、プログラムのエントリポイント(開始地点)となります。
ここからプログラムが実行されます。
エントリポイントはソースプログラム中で一つだけです。
wWinMain関数の戻り値はint型です。
APIENTRYはwWinMain関数の呼び出し規約を示しています。
APIENTRYはエントリポイントであることをしますためのものです。
実際は、__stdcallに展開されます。
04~07行目はシステムから受け取るパラメータです。
04行目
_In_ HINSTANCE hInstance
_In_とはhInstanceパラメータが入力パラメーターであることを示しています。
_In_はSAL 注釈(Microsoft のソース コード注釈言語)というもので、C言語ではありません。
なので、無くてもコンパイルできます。
なぜ利用されるのかというと、コードをわかりやすくし、間違いにくくするためです。
hInstanceパラメータは、HINSTANCE型なので、インスタンスのハンドル(HはハンドルのHです。小文字のhも同様です)を示しています。
では、何を受け取るのかというと、
このアプリケーションを識別するためのハンドルです。これは、特定のWindowsAPIを利用するために使われます。
05行目
_In_opt_ HINSTANCE hPrevInstance
_IN_opt_というは、オプション(option)の入力パラメータを示しています。
オプションなので受け取るパラメータがない場合は、NULLです。
hPrevInstanceパラメータは、現在使われていませんので、NULLとなります。16bitの時に使用されていたとのことです。
過去の遺物です。
06行目
_In_ LPWSTR ipCmdLine
ipCmdLineパラメータはLPWSTR型です。
LPWSTRの意味を見ていきます。
STRというのはString(文字列)を表します。文字列に使用する型であることが分かります。
Wというのは、Unicode文字を示しています。
Pというは、ポインタです。
LはLongのLです。
結果として、LPWSTRというのは16 ビット Unicode 文字の null で終わる文字列へのポインターを表しています。
では、ipCmdLineパラメータには何が入っているのでしょうか。
名前の通り、コマンドラインの引数が入っています。
07行目
_In_ int nCmdShow
nCmdShowパラメータは、メイン アプリケーション ウィンドウが最小化、最大化など、どのように表示してもらいたいかを示すフラグです。
このパラメータは、ShowWindow 関数 (winuser.h) で使います。値は、winuser.hで「SW_」で始まる定数で定義されています。
ここまでが、wWinMain関数についてです。
〇次に画面にメッセージを表示してみたいと思います。
10行目
MessageBox(NULL, TEXT("hello, world"), TEXT("日本"), MB_OK);
で画面にメッセージを表示しています。
MessageBoxはマクロの定義ですので、実際にはMessageBoxW 関数 (winuser.h) に展開されます。
関数の宣言は次のとおりです。
int MessageBoxW(
[in, optional] HWND hWnd,
[in, optional] LPCWSTR lpText,
[in, optional] LPCWSTR lpCaption,
[in] UINT uType
);
hWndパラメータは、作成するメッセージ ボックスの所有者ウィンドウへのハンドルです。
ここでは、ウィンドウがないので NULL を設定します。
lpTextパラメータは、表示するメッセージです。
ここでは、"hello, world"という文字列を与えます。
TEXTというマクロを使って"hello,world"をL"hello,world"に展開してます。
Lをつけることでワイド文字列(ここではUnicode文字列)を示します。
L"..."はC言語の仕様です。
lpCaptionパラメータは、ダイアログ ボックスのタイトルです。
(ダイアログボックスとは、MessageBox関数で表示されるウィンドウのことです。)
タイトルは、"日本"にしてありますが、特に理由はありません。
uTypeパラメータは、ダイアログ ボックスの内容と動作を指定します。
ここでは、MB_OKを指定してます。
ダイアログボックスには、[OK] という 1 つのプッシュ ボタンが表示されます。
〇return文について
10行目のreturn文で、プログラムが終了して、int値がシステムに返されます。
ここでint値は、MessgaeBox関数で[OK]ボタンが押された場合は、IDOKの値です。
IDOKは1ですので、1が戻り値としてシステムに返されることになります。
一般的に関数の戻り値として0が異常を表すことが多いです。
〇プログラムを実行すると、
こんな感じで表示されます。