1-2.WinMain関数
さて、これからゆっくりと勉強を始めていきましょう。main()
関数でしたよね??WinMain()
関数になります。つまり、main()
関数は出てこない、というわけです。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
WINAPI
、HINSTANCE
、LPSTR
について軽く説明をします。WINAPI
は関数の呼び出し規約を定めるMicrosoft固有の仕様です。通常は__standcall
キーワードを表すマクロとして割り当てられています。__standcall
の呼び出し規約とは、関数を呼び出すときに引数をどのように渡すかなどの決まりのことです。WinMain()
関数を使うときに指定してやればいいんだなという程度に覚えておいてください。HINSTANCE
はインスタンスハンドルと呼ばれる情報で、アプリケーションそのものを表す一意の値を表しています。hInstance
にはWinMain関数を実行しているこのアプリケーションそのものを表すインスタンスハンドルが格納されています。
hPrevInstance
には常にNULL
が格納されています。「H」
がつくものは、すべてハンドルと呼ばれるものです。ハンドルって??
ハンドルとは、オブジェクト指向設計におけるオブジェクトに近い存在です。
ハンドルを取得するには、CreateWindow()
関数のようなオブジェクト生成用の関数を呼び出します。
こうした関数がメモリを割り当て、割り当てた領域を初期化して返すのです。
ハンドルを取得すると、ほとんどのケースでDelete()
関数によってハンドルを開放する必要があります。
C言語におけるmalloc()
関数とfree()
関数の関係と同じようなものですね。
ハンドルを使うことによって、ハンドルとして割り当てられているメモリ領域の実体を隠蔽することができ、内部事情による拡張や仕様変更が外部の開発者に与える影響を少なくすることができます。
LPSTR
は、文字列へのポインタを表します。lpCmdLine
には、コマンドライン引数として渡されたNULL
で終わる文字列へのポインタが格納されています。WinMain()
関数を使った、何もしないプログラムを作ってみよう。windows.h
ファイルをインクルートしましょう。#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //何もしないプログラムですが、実行はできます。 return 0; }