mogmo .NET

C#/XAML/VB6たまにC++についてメモ程度に書いていく。あくまで自分用。責任は取れません。

VC++のUnicodeコンソールアプリケーションで作るときの初期処理

mainではなくwmainを使う

ユニコードアプリの場合,wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] )を使用します。
デフォルトのコードではmainとなっているので,関数名と引数を適宜変更しましょう。
コマンドライン引数も,ユニコードの場合はワイド文字列データ型のwchar_tにしましょう。
Debug版のアプリケーションは起動するが,リリース版で起動せず終了してしまう現象が発生。

コンソールに日本語出力できるようにする

wprintfstd::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関数の引数を以下のように設定します。
arcCountarcValue[]の要素数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

引用:
Unicode のサポート | Microsoft Docs

文字列

_T("ハローワールド")と定義しておけば条件によってユニコード文字列として扱ってくれます。

CString

CString_TCHARをベースとして使用しているため,文字セットをさほど気にせず扱うことができます。
具体的には,MBCSシンボルまたはUNICODEシンボルがコンパイル時に定義されているかどうかにしたがって、char型またはwchar_t型のいずれかをサポートする動作のようです。
引用:
CString の使用 | Microsoft Docs

次回

VC++のコンソールアプリケーションでstdやWinAPI使ってファイル操作をする

written by @mogmo