WinMain関数

Visual C++ 2013 Win32アプリケーション作成 を参考に、プロジェクトを作成して下さい。

流れ

1.windows.hをインクルード

Win32アプリケーションでは、windows.hは必須です。

2.WinMain()

コンソールアプリケーションでは、main関数が必須でしたが、Win32アプリケーションでは、WinMain()が 必須です。WinMain()からプログラムが開始されます。

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

4つの引数の説明。今回この引数を使いませんので、読み飛ばして構いません。

引数 意味 解説
hInstance インスタンスハンドル ハンドル・・・ウィンドウ・ファイル・画像などの各構成要素(オブジェクト)を指し示すための識別子。
Windowsが識別するIDと考えれば、分かりやすいと思います。
・インスタンスハンドルとは、ここのプログラムを識別するためのハンドル
変数の型はHINSTANCE型
(HINSTANCE型は、構造体へのポインタです。)
hPrevInstance 未使用(常にNULL) (Win16時代にインスタンスハンドルとして使用)
lpCmdLine コマンドライン引数 (コマンドプロンプトやショートカットで「実行ファイル名」の後ろにスペースを挟んで入力した文字列)
変数の型はLPSTR型(Long Pointer STRing。char*型と同じ文字列型)
nCmdShow ウィンドウの表示方法 起動時のウィンドウの表示方法を決めます。ウィンドウの表示方法は、通常・最大化・最小化などがあります。

呼び出し規約

WinMain関数の前に必ず、「APIENTRY」もしくは、「WINAPI」と指定する必要があります。
#define APIENTRY WINAPI
#define WMIAPI __stdcall
と定義されていますので、「APIENTRY」と「WINAPI」は、__stdcallを意味します。

__stdcallは、「呼び出し規約」と呼ばれるもののひとつです。
呼び出し規約とは、スタックというメモリ領域の利用の仕方を決めています。

_tWinMain()

WinMain()の代わりに、_tWinMain()を使用する方法もあります。Visual C++が自動生成するソースコード は、_tWinMain()を使っています。
この場合tchar.hをインクルードする必要があります。

tchar.hの中で、_tWinMainからWinMainに変換しています。
つまり、全く同じ動作をします。

test.cpp
#include <windows.h>
#include <tchar.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    return 0;
}

lpCmdLineの変数の型が、LPTSTR型に変わっている点に注意してください。
LPTSTR型は、文字セットをunicodeでコンパイルすると、LPWSTR型(= WCHAR*型、ユニコードの文字列型)に、 文字セットをマルチバイトでコンパイルすると、LPSTR型(= char*型、マルチバイトの文字列型)になります。

LPTSTR、LPWSTR、LPSTRなどの文字列の型は、
文字列の型
で解説しています。命名基準も記載していますので、ご覧下さい。

ソースコードの入力

ソースコードは下記のように入れてください。
今回作成するアプリケーションは、まだ何も表示しません。

test.cpp

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,
                     int nCmdShow)
{
    return 0;
}

次のステップ

次に ダイアログボックスの作成 へ進んでください。
リソースファイルを作成したくない場合は、 ウィンドウの表示 へ進んでください。