晴れ

[資][VC++] ATLTRACE2 でワイド文字列を使う方法
デフォルトでは ATLTRACE2 の引数にワイド文字列*1を渡しただけだと何も出力されない。トレース文出力処理そのものは行われているのだが文字列が全く出力されないのである。
デバッグで追いかけてみると output.c で定義されている _output() 関数の中で wctomb() 関数*2の実行が失敗していた。
wctomb() 関数の失敗は実行環境のロケールで変換ができない事を意味する。
ヘルプによれば、 VC++ で作成したプログラムはデフォルトで起動時に


setlocale(LC_ALL, "C")
の実行が行われるとある。つまり C ロケールで日本語のワイド文字列の変換を行おうとしたために失敗していた訳である。ちなみにヘルプによると" C ロケールでは char 型のデータが全て 1 バイトで表現され、その値が常に 256 未満であると想定されます。"とある。


結論としてはロケールの設定を行う事で wctomb() 関数による文字の変換が行われるようになり、その結果 ATLTRACE2 でワイド文字列の出力が可能になる。
日本語環境であれば


setlocale(LC_ALL, "japanese")
または

setlocale(LC_ALL, "jpn")
を実行する事で ATLTRACE2 によるワイド文字列の出力ができるようになる。
なお、上記例は言語識別文字列による指定の例。国/地域識別文字列で指定する場合は "jpn" か "japan" を使用する。

*1:L"ほげほげ" や _UNICODE プリプロセッサシンボル定義時の _T("ほげほげ") など

*2:ワイド文字をマルチバイト文字へ変換する関数