ATLTRACE と ATLTRACE2 で日本語文字列を使うと

たまたま、ATL を使って UNICODE ビルドでプログラムを書いていた際に気が付いたので、自分用に。
ATL or WTL を使っている際、よくデバッグ用に ATLTRACE2(ATLTRACE)を使い、VS の出力ウィンドウに
デバッグ用途で出力させますが、文字列に日本語を指定したところ、

ATLTRACE2(atlTraceGeneral, 0, TEXT("リンクファイル名: %s\n"), strPath);

出力ウィンドウに

_CrtDbgReport: String too long or IO Error

と表示されました。はっ?何ですか?これ。(プログラムは正常に動きます)

あまりというか、文字列に日本語を書くことがなかったので、初めて気が付きました。
文字セットを「マルチ バイト文字セットを使用する」にすると、何事もなく表示…。
で、文字セットを「Unicode 文字セットを使用する」にすると、先のエラーに。

VS2010ビルドプロパティ_文字セット

30 秒程悩んだところ、以前、コンソールプログラム(Unicode ビルド)でも日本語を表示しようとしたときに
”はまった”記憶があったので、もしや、これも、ロケールの問題かと思い、試してみたところ、ビンゴでした。
何をやって回避したかというと、一行

_wsetlocale(LC_ALL, L"japanese");

もしくは、

setlocale(LC_ALL, "japanese");

を追加しただけです。これで、ATLTRACE2 で日本語文字列を表示することができました。

今回は、第二引数に ”japanese” と指定しましたが、

_wsetlocale(LC_ALL, L"");

もしくは、

setlocale(LC_ALL, "");

でも構いません。
第二引数となる locale を空にした場合には、OS から ANSI コードページを取得して設定してくれます。
ちなみにですが、プログラムのスタートアップ時には上記 URL にも説明があるように LC_ALL=”C” で実行されています。

今回は、Visual Studio 2010 を使った際に起こった現象だったのですが、試しに Visual Studio 2008 でも試してみたら
同様のことが起こりました。ATL の仕様といえば、それまでですが…。
UNICODE ビルドする際には、注意ですね。

もしかして、これって有名な話しだったりするのかな。