お世話になります。
環境:VS2010
あるAPIの引数が const char* であり、APIを呼び出す側では、文字列をCStringで持っています。どうにかして const char * に変換して渡した
いのですが、どのようにしたら実現できますでしょうか。
非常に困っています。どうかご教授下さい。
CString → const TCHAR* への変換は自動でできる。
UNICODE build のとき TCHAR=wchar_t なので CString → const wchar_t* は自動で可能。
MBCS build のとき TCHAR=char なので CString → const char* は自動で可能。
VS2010 のデフォルトは UNICODE build
ということで標準では「できない」わけだが、解決策はいくつかあって
1. MBCS build にしてしまう
2. そこでだけ wchar_t → char の変換を行う
3. その API とやらに const wchar_t* 版があればそちらを使う
1. は影響度が大きすぎて推奨できない(いまさら MBCS にすべきでもない)
2. をすると文字化けなどが発生する可能性がある
3. がお勧め。
およそ Microsoft の提供している API なら ApiFuncW みたいに UNICODE 版があるはず。
VS2010なら、引数にCT2A(str)を渡すだけで可能です。
CString str;
ApiFunc(CT2A(str));
のような記述になります。
ただ、tetrapodさんの言われるように、
UTF-16にしかない文字が含まれていたら文字化けしますし、
MicrosoftのAPIなら、CStringのまま渡せるものが多いと思いますよ。
たとえば、IntelliSenseに頼りすぎて、
ApiFuncA()のように、うしろにAが付いているものを選んでしまっていませんか?
そのようなAPIにCStringを渡すのであれば、ApiFuncA()でもApiFuncW()でもなく、
ApiFunc()を使うようにしておくべきです。
CStringAを明にかますとか。
ツイート | ![]() |