Visual C++ 6でプロジェクトを作成した場合、デフォルトでANSIで作られる。これをUNICODEでビルドするには、以下の手順で行う。
構成の追加
[ビルド]→[構成]で新しい構成を作成する。ここでは名前を「UnicodeDebug」とした。
UNICODEディレクティブ追加
プロジェクトの設定で、「プリプロセッサの定義」に”UNICODE”と”_UNICODE”を加える。
これを加えることにより、以下のようなプリプロセス処理が行われる。
- MessageBoxなどのAPIがMessageBoxAからMessageBoxWになる。
- LPCTSTRのようなTを含む文字列マクロがWCHARになる。
- _Tマクロで括られた文字列がL””になる。
エントリーポイント
プロジェクトの設定のエントリポイントを”wWinMainCRTStartup”に変える。コマンドラインアプリの場合は”wmainCRTStartup”にする。
WinMainをwWinMainに変える
あるいは_tWinMain見たいのにする。この場合”tchar.h”をインクルードする。コマンドラインアプリの場合は_tmain見たいのにする。
1 2 3 4 |
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) |
これでリンクするとインストールの状態によっては、MFC40UDがない、みたいなリンクエラーになることがある。これはMFCのUnicdeライブラリなので、このエラーが出た場合は、VC6のインストーラを起動して、MFCのUNICODEライブラリをインストールする。
すでにプロジェクトがある場合
すでにANSIで作ったプロジェクトをUNICODEにする場合は、以下のようにする。
- リテラル文字列を_Tマクロで括る
- charをTCHARにする
- std::stringはtstring見たいなのをtypedefする
- ANSIのCランタイム関数を使っている場合は、T系に直す。strlen→_tcslen。
ただし、GetProcAddressのようなANSI文字列のみを受け取るAPIもあったりするし、APIの引数に渡すバッファのサイズが文字数単位なのかバイト単位なのかとかも注意しないとならないので大きいプロジェクトの場合は大変と思われる。
デバッグ時にUNICODE文字列を表示する
デバッグ時に変数のツールチップなどにUNICODE文字列を表示するには[ツール]→[オプション]から”unicode 文字を表示”をチェックする。
UNICODEでビルドする利点と欠点
利点
- NT系OSで速くなる?NT系OSは内部的にUNICODEを使っているので、ANSI→UNICODEの変換が不要になる。
- 韓国語や中国語が使えるようになる。
- 日本語以外のNT系OSでも文字化けしないで実行できる。(フォントがある場合)
欠点
- 98系OSで動かなくなる。
Visual Studio 2008からデフォルトでUNICODEビルドになった。