お世話になります。
下記のコードはUNICODEでコンパイルしております。
LPCTSTR lp = _T("あいうえおかきくけこ"); LPCSTR lpa = CW2A(lp); ::MessageBoxA(NULL,lpa,"TEST",MB_OK);//文字化けする ::MessageBoxA(NULL,CW2A(lp),"TEST",MB_OK);//文字化けしない
変数に代入すると正しく変換しません。 が引数に直接使用すると文字化けしません。
この違いがわかりません。
「CW2A」でググれば説明が出てきます。
ATL と MFC の文字列変換マクロ 一時クラスのインスタンスに関する警告に書かれていますが、 LPCSTR lpa = CW2A(lp); は不正な使い方で
CW2A lpa( lp );
とする必要があります。
なお、CW2Aはwchar_t文字列からchar文字列への変換であり、今回のTCHAR文字列からcharへの変換にはCT2Aを使うべきです。
// 何でコンパイルしてるにせよ、文字型としてT系を使っているのなら変換マクロもCT2Aなどを使うべきでしょう。
ATL と MFC の文字列変換マクロ (ATL)
の「一時クラスのインスタンスに関する警告」に、マクロの結果をLPCXSTRで受け取ってはならない旨の注意書きがあります。