[Visual C++] CString::LoadString() 文字化け対策

今更MFCでも無いが、随分前に書かれたMFCベースのアプリをビルドして実行したらステータスバーが文字化け。

現象

ステータスバーの日本語が文字化けする。

リソースの文字列テーブルでID_FIELD_ATRIBUTEに”属性”と定義しているのだけど、ステータスバーには”??”と表示される。

調査

MFCのソースを見ると、ステータスバーの表示文字列はCString::LoadString()関数でリソースから取得している。

Win32 APIを直接呼び出す

::LoadStringで取得した文字列は化けない。MFC依存の問題っぽい。

プロジェクト設定を変えて試す

環境: Windows 7 Home Premium 64bit
プロジェクト: MFCダイアログベースアプリ
(1) Win32/共有DLLでMFCを使う/マルチバイト文字セットを使用する – NG
(2) Win32/共有DLLでMFCを使う/Unicode文字セットを使用する – OK
(3) Win32/スタティックライブラリでMFCを使用する/マルチバイト文字セットを使用する – NG
(4) Win32/スタティックライブラリでMFCを使用する/Unicode文字セットを使用する – OK
(5) x64/共有DLLでMFCを使う/マルチバイト文字セットを使用する – NG
(6) x64/共有DLLでMFCを使う/Unicode文字セットを使用する – OK
(7) x64/スタティックライブラリでMFCを使用する/マルチバイト文字セットを使用する – NG
(8) x64/スタティックライブラリでMFCを使用する/Unicode文字セットを使用する – OK

Unicodeだと化けない。MBCS依存の問題っぽい

ネットで情報収集

似たような現象に直面した人を発見。

Re: loadstring fails in MBCS encoding
http://www.tech-archive.net/Archive/VC/microsoft.public.vc.mfc/2005-11/msg00510.html

1. You have to tell CString::LoadString to use another codepage. This can be
done by calling SetThreadLocale before calling CString::LoadString. Make
sure to revert to the system’s default codepage as soon as possible,
otherwise other parts of the program might not work properly.

解決法

以下の追加で解決。