CString から const char* への変換


ひで  2012-05-23 07:01:19  No: 73397

お世話になります。
環境:VS2010

あるAPIの引数が const char* であり、APIを呼び出す側では、文字列をCStringで持っています。どうにかして const char * に変換して渡した
いのですが、どのようにしたら実現できますでしょうか。

非常に困っています。どうかご教授下さい。


tetrapod  2012-05-24 03:00:08  No: 73398

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 版があるはず。


ひる  2012-05-24 19:25:52  No: 73399

VS2010なら、引数にCT2A(str)を渡すだけで可能です。

CString str;
ApiFunc(CT2A(str));

のような記述になります。

ただ、tetrapodさんの言われるように、
UTF-16にしかない文字が含まれていたら文字化けしますし、
MicrosoftのAPIなら、CStringのまま渡せるものが多いと思いますよ。

たとえば、IntelliSenseに頼りすぎて、
ApiFuncA()のように、うしろにAが付いているものを選んでしまっていませんか?
そのようなAPIにCStringを渡すのであれば、ApiFuncA()でもApiFuncW()でもなく、
ApiFunc()を使うようにしておくべきです。


Blue  2012-05-24 19:41:28  No: 73400

CStringAを明にかますとか。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加