mainではなくwmainを使う
ユニコードアプリの場合,wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] )
を使用します。
デフォルトのコードではmain
となっているので,関数名と引数を適宜変更しましょう。
コマンドライン引数も,ユニコードの場合はワイド文字列データ型のwchar_t
にしましょう。
Debug版のアプリケーションは起動するが,リリース版で起動せず終了してしまう現象が発生。
コンソールに日本語出力できるようにする
wprintf
やstd::wcout
を使ってコンソールに文字列を出力しますが,ユニコードアプリの時はひと手間加えてあげる必要があります。
また,どちらか片方を使うように統一したほうが良さそうです。
wprintfを使用する
setlocale(LC_ALL, "japanese");
ロケール設定を日本にすると,日本語が出力されます。
int wmain() { int nRetCode = 0; HMODULE hModule = ::GetModuleHandle(nullptr); wprintf(_T("ぐんないわーるど\n)"); // うつらない setlocale(LC_ALL, "japanese"); // memo: add: wprintfでShift-JISを出力するためのおまじない【注意】std:coutで日本語出力はされなくなる。 wprintf(_T("はろーわーるど\n)"); // 表示される ... }
std::wcoutを使う
必要に応じてstd::wcout.imbue(std::locale("japanese"))
を設定してあげると日本語が表示されるようになる。
int wmain() { int nRetCode = 0; HMODULE hModule = ::GetModuleHandle(nullptr); std::wcout << _T("はろーわーるどできん") << std::endl; // 表示されるか確認 std::wcout.imbue(std::locale("japanese")); // std::wcout.imbue(std::locale("ja")); // これでもいい std::wcout << _T("はろーわーるど!") << std::endl; // 表示される ... }
引数を受けとる
wmain関数の引数を以下のように設定します。
arcCount
はarcValue[]
の要素数,arcValue[]
は実際の文字列が入力されます。
arcValue[0]
は必ず自身のアプリケーション名になるので,必ず1以上の値になります。
ドラッグアンドドロップで受け付けたフォルダパスなどは2番目の配列に入ります。
int wmain(int argCount, wchar_t* argValue[])
キーを入力するまでポーズする
キー入力を受け付けるわけではなく,単純にポーズさせたい時はsystem("pause")
でポーズすることができます。
system("pause");
補足:system関数(ワイド文字列を使う場合は_wsystem)はプログラム内から別のプログラムを起動するための関数です。
引数にはコマンドプロンプトで打ち込む文字列と同様の文字を入力してあげます。
文字列を扱うときはマクロを使う
万が一プロジェクトの文字セットを変更が発生したり,記述ミスをしてしまったときのために,以下の内容はマクロを使って定義しておくと安心です。
データ型
移植性のないデータ型 | 置き換えに使うマクロ |
---|---|
char, wchar_t | _TCHAR |
char*、 LPSTR (Win32 データ型)、 LPWSTR | LPTSTR |
const char*、 LPCSTR (Win32 データ型)、 LPCWSTR | LPCTSTR |
文字列
_T("ハローワールド")
と定義しておけば条件によってユニコード文字列として扱ってくれます。
CString
CString
は_TCHAR
をベースとして使用しているため,文字セットをさほど気にせず扱うことができます。
具体的には,MBCSシンボルまたはUNICODEシンボルがコンパイル時に定義されているかどうかにしたがって、char型またはwchar_t型のいずれかをサポートする動作のようです。
引用:
CString の使用 | Microsoft Docs