WinMain アプリケーション エントリ ポイント

すべての Windows プログラムには、 WinMain または wWinMain という名前のエントリ ポイント関数が含まれています。 次のコードは 、wWinMain の署名を示しています。

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

4 つの wWinMain パラメーターは次のとおりです。

  • hInstance は、 インスタンスへのハンドル またはモジュールへのハンドルです。 オペレーティング システムでは、この値を使用して、メモリに読み込まれるときに実行可能ファイルまたは EXE を識別します。 特定の Windows 関数では、アイコンやビットマップを読み込むなど、インスタンス ハンドルが必要です。
  • hPrevInstance には意味がありません。 16 ビット Windows で使用されましたが、現在は常に 0 です。
  • pCmdLine には、コマンド ライン引数が Unicode 文字列として含まれています。
  • nCmdShow は、メイン アプリケーション ウィンドウが最小化、最大化、または正常に表示されるかどうかを示すフラグです。

関数は値を int 返します。 オペレーティング システムでは戻り値は使用されませんが、 値を使用して状態コードを別のプログラムに渡すことができます。

などのWINAPI呼び出し規約は、関数が呼び出し元からパラメーターを受け取る方法を定義します。 たとえば、呼び出し規約では、パラメーターがスタックに表示される順序を定義します。 前の例に示すように 、wWinMain 関数を宣言してください。

WinMain 関数は wWinMain と同じですが、コマンド ライン引数は ANSI 文字列として渡されます。 Unicode 文字列を使用することをお勧めします。 プログラムを Unicode としてコンパイルする場合でも、ANSI WinMain 関数を使用できます。 コマンド ライン引数の Unicode コピーを取得するには、 GetCommandLine 関数を呼び出します。 この関数は、1 つの文字列内のすべての引数を返します。 引数を argv スタイルの配列にする場合は、この文字列を CommandLineToArgvW に渡します。

コンパイラは、標準のメイン関数ではなく wWinMain を呼び出す方法を知っていますか? 実際に行われるのは、Microsoft C ランタイム ライブラリ (CRT) によって、WinMain または wWinMain を呼び出す main の実装が提供されるということです。

CRT は main 内でさらに多くの作業を行います。 たとえば、 wWinMain の前に静的初期化子を呼び出します。 別のエントリ ポイント関数を使用するようにリンカーに指示することはできますが、CRT にリンクする場合は既定値を使用する必要があります。 それ以外の場合、CRT 初期化コードはスキップされ、グローバル オブジェクトが正しく初期化されないなどの予期しない結果になります。

次のコードは、空の WinMain 関数を示しています。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

エントリ ポイントを作成し、基本的な用語とコーディング規則の一部を理解したら、 最初の Windows プログラムを作成する準備ができました。