一般に、コンソールが必要ない場合は、「GUI」または「Windows」サブシステムを選択する必要があります (開発環境での呼び出しに応じて)。これは、リンカーが EXE ヘッダーに設定するビットを制御します。OSはプログラム内のコードを実行する前に、EXE ファイルを読み取り、使用するサブシステムを決定するため、プログラムの実行が開始された後はサブシステムを制御できません。
Windows サブシステムを使用する場合、ウィンドウは必要ありません。プログラムを読み込んでいるときに、コンソールが必要ないことをOSに伝えるだけです。Windows API を使用するかどうかとは関係ありません。どちらのサブシステムも本格的な Windows アプリケーションであり、Windows API 機能をフルに活用できます。
WinMain
からできることと同じことをすべて から行うことができますmain
。コマンド ラインをフェッチし、それを個別の引数に分割する関数があります。
ただし、メイン関数を呼び出したくWinMain
ない場合は、Windows サブシステムを使用できません。サブシステムの選択は、リンカがプログラムに挿入する準備コードのセットも制御します。準備コードは、プログラムの実際のエントリ ポイントが存在する場所であり、C++ 標準ライブラリを初期化し、名前空間スコープを持つオブジェクトのコンストラクターを呼び出すものです。コンソール モード呼び出しmain
(またはwmain
) に含まれるコード。Windows サブシステム呼び出し用にリンクされたコードWinMain
(またはwWinMain
)。Windows サブシステムを使用し、 という名前の関数を定義しないとWinMain
、リンク時にエラーが発生します。リンカーは、未定義の関数について文句を言います。(定義するためにwindows.hを含める必要はありません。WinMain
、そのヘッダーを含めることが恐れている場合。)
使用するサブシステムは EXE ヘッダー内のビットのセットにすぎないため、editbin
プログラムとのリンクが発生した後に変更します。リンクするときは、コンソール サブシステムを選択してコンソール準備コードと を取得し、main
代わりに Windows サブシステムを使用するようにバイナリを変更します。
リンク foo.obj /out foo.exe /subsystem:CONSOLE
editbin /サブシステム:WINDOWS foo.exe
その後、プログラムはコンソールなしで実行されます。起動中に問題が発生した場合、準備コードがプログラムをクラッシュさせる可能性があることに注意してください。これは、書き込み可能なコンソールがあることを期待して書かれているが、そこにないためです。