1-2.WinMain関数

さて、これからゆっくりと勉強を始めていきましょう。

C言語を使ったことがある方ならわかると思いますが、一番の基本となる関数はmain()関数でしたよね??
WindowsプログラミングではそれがWinMain()関数になります。つまり、main()関数は出てこない、というわけです。
この関数が全ての基本になるので、しっかりと覚えていきましょう。
この関数の宣言は次のように宣言をします。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

いきなり、見慣れないデータ型が出てきました。Windowsプログラミングにはこのような新しい型やマクロが大量に定義されています。
全てを覚えることは無理ですが、よく出てくるものは覚えていきましょう。
詳しくは付録のデータ型のところで説明をし、ここではWINAPIHINSTANCELPSTRについて軽く説明をします。

WINAPIは関数の呼び出し規約を定めるMicrosoft固有の仕様です。通常は__standcallキーワードを表すマクロとして割り当てられています。__standcallの呼び出し規約とは、関数を呼び出すときに引数をどのように渡すかなどの決まりのことです。
あまり気にすることなく、WinMain()関数を使うときに指定してやればいいんだなという程度に覚えておいてください。

HINSTANCEはインスタンスハンドルと呼ばれる情報で、アプリケーションそのものを表す一意の値を表しています。
hInstanceにはWinMain関数を実行しているこのアプリケーションそのものを表すインスタンスハンドルが格納されています。
hPrevInstanceには常にNULLが格納されています。
ちなみに、接頭語に「H」がつくものは、すべてハンドルと呼ばれるものです。

ハンドルって??
ハンドルとは、オブジェクト指向設計におけるオブジェクトに近い存在です。
ハンドルを取得するには、CreateWindow()関数のようなオブジェクト生成用の関数を呼び出します。
こうした関数がメモリを割り当て、割り当てた領域を初期化して返すのです。
ハンドルを取得すると、ほとんどのケースでDelete()関数によってハンドルを開放する必要があります。
C言語におけるmalloc()関数とfree()関数の関係と同じようなものですね。
ハンドルを使うことによって、ハンドルとして割り当てられているメモリ領域の実体を隠蔽することができ、内部事情による拡張や仕様変更が外部の開発者に与える影響を少なくすることができます。


LPSTRは、文字列へのポインタを表します。
lpCmdLineには、コマンドライン引数として渡されたNULLで終わる文字列へのポインタが格納されています。

では、さっそくWinMain()関数を使った、何もしないプログラムを作ってみよう。
Windows用のマクロなどを用いる場合は、必ずwindows.hファイルをインクルートしましょう。

sample2 (何もしないプログラム)

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
	//何もしないプログラムですが、実行はできます。
	return 0;
}


sample2のプログラムは何もしないですぐに終了するようなプログラムです。
なぜすぐ終了するかというと、ウィンドウを作成する作業を行っていないため、実行してもすぐに終了してしまうのです。