WinMain とは何か?

C 言語を習った、勉強したのに、Windows プログラミングに取り掛かろうとすると、 とたんに手が出なくなります。

そもそも Windows プログラムでは main 関数がありません。

「main がない・・・じゃぁ、どこからプログラムが開始するの?」

と疑問に思うことでしょう。

その答えが、WinMain 関数です。

前回のコードを復習してみてください。main 関数がない代わりに、WinMain だけがあります。

WinMain って何?

リンカオプションでサブシステム (/SUBSYSTEM) を WINDOWS に指定すると、 デフォルトのエントリポイントは WinMain になります。

ですから、Windows プログラムは通常、WinMain から実行が始まる、ということになります。

サブシステムの指定とエントリポイント

リンカオプションでサブシステムを指定する、ということは簡単に言うと 「どんな環境用のコードを生成するか指定する」 ということです。

Windows 向けのコードなら WINDOWS という値を、ウィンドウを持たないキャラクタ ベースのプログラムなら CONSOLE という値を、などとそれぞれ指定します。

サブシステムとして WINDOWS が指定されていると、リンカは WinMain という名前の 関数を探して、それをプログラムのエントリポイントに設定します。

「エントリポイントに設定する」ということは、OS がプログラムを実行するために EXE ファイルをメモリにロード (読み込む) した後、どのアドレスからプログラムを 実行するか指定する、ということです。

実は EXE ファイルのヘッダ部分にエントリポイントのアドレスを書き込む場所があり、 リンカはその情報を埋めるために WinMain という関数のアドレスを探しているのです。

ちなみにリンカオプション /ENTRY で、エントリポイントなる関数の名前を変更する ことも出来ます。WinMain という名前が嫌なら違う名前に変えても構いません。

しかし、特に名前を変える理由は普通無いので、WinMain からプログラムが始まる と覚えていただいて結構、というわけです。

暇な方は WinMain ではない名前に変えて実験してみましょう。

エントリーポイントを WinMain と違う名前に変えてみた