CString から const char* への変換


ひで  2012-05-22 22:01:19  No: 73397  IP: 192.*.*.*

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

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

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

編集 削除
tetrapod  2012-05-23 18:00:08  No: 73398  IP: 192.*.*.*

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 10:25:52  No: 73399  IP: 192.*.*.*

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 10:41:28  No: 73400  IP: 192.*.*.*

CStringAを明にかますとか。

編集 削除