今更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.
解決法
以下の追加で解決。
1 |
::SetThreadLocale(0x0411);C |