EternalWindows
基礎 / WinMain 関数

それでは、Windowsプログラミングを始めていきたいと思います。 次に示すコードは、実行しても直ぐに終了する何もしないWindowsプログラムです。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	return 0;
}

まず、このコードがC言語で書かれているということを意識してください。 確かに見たことのない文字列が大量に含まれていますが、 #includeやint、returnなどは全てC言語で扱ったキーワードであり、 落ち着いて1つずつ見ていけば理解できる部分は必ずあります。

#include <windows.h>

たとえば、このコードに関しては特に難しい要素はないと思われます。 いうまでもなく、windows.hというヘッダーファイルをインクルードしているのです。 それでは、次のコードはどうでしょうか。

int WINAPI WinMain(...)
{
	return 0;
}

このコードは、先のコードと比べると若干複雑ですが、 よく見てみるとWinMainという関数を書いているということに気付くはずです。 確かにWINAPIという文字列や関数の引数(上記コードでは省略)は、 見たことのないものばかりですが、戻り値はC言語で馴染のあるint型になっています。 そのため、WinMain関数はretuen文で数値を返しています。

WinMain関数は、Windowsプログラムのエントリポイント(出発点)です。 Windowsプログラムは、必ずこの関数から実行されます。 この要領は、コンソールプログラムのmain関数とよく似ています。 次のコードは、何もしないコンソールプログラムです。

void main(void)
{
}

WinMain関数を見た後にこのコードを見てみると、 関数名やプロトタイプの違いはあれ、それほどWindowsプログラムのコードと大差がないと思われるでしょう。 人によっては、WinMainかmainかだけの話だと割り切るかもしれません。 しかし、上記の何もしないコンソールプログラムと何もしないWindowsプログラムとでは、 明らかに異なる部分が1つあります。 それは、次のコードです。

#include <windows.h>

何もしないコンソールプログラムには、このコードはありませんでした。 理由は非常に簡単で、必要ないからです。 これは言い換えれば、Windowsプログラムにはwindows.hが必要と解釈できます。 何故、Windowsプログラムにはwindows.hが必要なのでしょうか。 それは、Windowsプログラムがwindows.hに定義されている型や識別子を利用するように設計されているからに他なりません。 WINAPIやHINSTANCEなどは見慣れない文字列ですが、 実はwindows.hにて、意味を持つ型や識別子として定義されているのです。

Windowsプログラムはwindows.hに定義されている型や識別子を利用するため、 どのような型が定義されており、それは何を意味しているのかを理解することが非常に重要です。 次節は、Windowsプログラミングをするうえで必ず付き合うであろう型や識別子を表にまとめ、 それを参照しつつWinMain関数の引数の意味を説明します。


戻る