Visual Studio (C/C++) では新しい Win32 プロジェクトを作成するときに、 アプリケーションの種類として Windows アプリケーション
または コンソール アプリケーション
を指定することができます。
プロジェクトをコンソールアプリケーションで作り始めて、 途中で Windows アプリケーションに変更したくなることもありますよね。今回は、 既存プロジェクトのアプリケーションの種類を変更する方法を紹介します。
アプリケーションの種類によるエントリポイントの違い
Win32 プロジェクトではアプリケーションの種類によってプログラムのエントリポイントが異なります。
コンソールアプリケーションの場合は、 main 関数というエントリポイントからプログラムが始まります。(tchar.h をインクルードしている場合は _tmain 関数を使用することができます。)
#include <tchar.h>
//コンソール アプリケーションの場合
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Windows アプリケーションの場合は、 main 関数ではなく WinMain 関数というエントリポイントからプログラムが始まります。(tchar.h をインクルードしている場合は _tWinMain 関数を使用することができます。)
#include <tchar.h>
//Windows アプリケーションの場合
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
return 0;
}
アプリケーションの種類を変更するときには、 エントリポイントとなるメイン関数を書き換える必要があります。
_tmain を _tWinMain に変更してみる
コンソールアプリケーションを Windows アプリケーションに変更するために、 _tmain
を _tWinMain
に変更して、 ビルドし直してみます。
エラーが発生してしまいました。
error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
Visual Studio はコンソールアプリケーションとしてビルドしようとして、 まだ main 関数を探しているようです。
プロジェクトの構成プロパティでサブシステムを変更する
プロジェクトの構成プロパティを変更することで、 アプリケーションの種類をコンソールアプリケーションから Windows アプリケーションに変更することができます。
プロジェクトのプロパティページを開いて、 構成プロパティ → リンカー → システム を表示します。サブシステムを コンソール (/SUBSYSTEM:CONSOLE)
から Windows (/SUBSYSTEM:WINDOWS)
に変更します。
プリプロセッサの定義も変更します。構成プロパティ → C/C++ → プリプロセッサ を表示します。プリプロセッサの定義にある _CONSOLE;
という文字列を _WINDOWS;
に書き換えます。
プロジェクトをビルドし直すと、 エラーが解消されて Windows アプリケーションとしてのビルドが成功します。