画面にメッセージを表示する簡単なプログラムを見ていきます。

 

main.c

  1. #include <windows.h>
  2.  
  3. int APIENTRY wWinMain(
  4.     _In_ HINSTANCE hInstance,
  5.     _In_opt_ HINSTANCE hPrevInstance,
  6.     _In_ LPWSTR ipCmdLine,
  7.     _In_ int nCmdShow
  8. ) {
  9.  
  10.     return MessageBox(NULL, TEXT("hello, world"), TEXT("日本"), MB_OK);
  11.  
  12. }

 

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が異常を表すことが多いです。

 

〇プログラムを実行すると、

こんな感じで表示されます。