mfcで練習しています。
A2Wを使いたいのですが、
「 'CString' から 'LPCSTR' に変換できません。」とエラーが出ます。
調べたのですが、http://msdn.microsoft.com/ja-jp/library/87zae4a3(v=vs.80).aspx で、「AtlBase.h, AtlConv.h (AtlConv.h 内で宣言)」とあります。
これの意味が解からないで困って降ります。
教えて頂けませんでしょうか。
よろしくお願いします。
Visual Studioのバージョンはいくつですか?
>>「 'CString' から 'LPCSTR' に変換できません。」とエラーが出ます。
はどんな記述で出ますか?
Blueさん
Visual StudioのバージョンはVisual Studio2010です。
「wcsncpy(captureFile, A2W(m_captureFile), MAX_PATH);」の所で出てきます。
よろしくお願いします。
wcsncpyならそのままいけるんじゃない?
wcsncpy(captureFile, m_captureFile, MAX_PATH);
ちなみに
>>A2W
は A(NSI文字列)をW(ide Char文字列)に変換する関数(マクロだっけ?)で
>>wcsncpy
は wcs(=Wide Char String)を引数にとるものです。
ちなみに、プロジェクトのプロパティの文字セットが
「Unicode文字セットを使用する」
となっているときとしたときだと考えて発言しています。
CString=CStringW
Blueさん
おそらく、
http://msdn.microsoft.com/ja-jp/library/87zae4a3
の、「AtlBase.h, AtlConv.h (AtlConv.h 内で宣言)」部分だと思います。
2つともincludeしてみたのですが、変化はありませんでした。
よろしくお願いします。
A2Wは絶対使わないとまずいのかということを問題にしたんですが・・・
>>「 'CString' から 'LPCSTR' に変換できません。」
は引数としている
>> m_captureFile
を A2W で欲する型である LPCSTR に変換できないというエラーです。
このエラーが出るということは、
>>プロジェクトのプロパティの文字セットが
>>「Unicode文字セットを使用する」
ということになっているわけで、
そもそもCStringを引数にとるなら、T2Wを使うべきで。
>>wcsncpy
を使う上で、Unicode文字セットのCStringの変数ならA2Wを使う必要性がまったくないわけで。
無理やり使うなら
CStringA hoge(m_captureFile)
wcsncpy(captureFile, A2W(hoge), MAX_PATH);
でいいんじゃね。
こんなコード後輩がかいてたら問い詰めるけどね。
納得できたのだろうか・・・とりあえず、以下のことを覚えておくといい。
MFC の世界において「文字」を表現するには歴史的事情により2方法ある。
A と名のつく表記方法は [ASCII + マルチバイト] 文字という表記方法。
W と名のつく表記方法は [UTF-16] という表記方法。
T と名のつく表記方法は、コンパイル時に上記 A または W のどちらかになるという表記方法。
A 表記は各地方固有の文字限定(日本語と中国語は同時に扱えない)
W 表記は(制限はあるが)世界共通表記(日本語と中国語が同時に扱える)
A2W という変換マクロは [ A 表記を W 表記に変換する ] 機能を持っている。
ところが CString は T 表記、つまり [ A 表記または W 表記のどちらか] なわけだ。
出てきたコンパイルエラーを意訳すると [ T 表記を A 表記に変換できません] ということ。
つまりどういうことかというと
A2W は、変換元として A 表記が必要なのに
引数として CString を与えているから T 表記になっていて、
表示されたエラーは「変換できません」ということだ。
T は A または W なわけなので、
もし今 T=A であるなら A2W で変換できるはず(なのに今できていない)
もし今 T=W であるなら A2W 自体が不要
ということで Blue 氏のコメントは [変換しなくていいんぢゃねーの?] と提案しているわけだ。
どう直すとよいかは方針次第というか・・・
要するに T, W, A 表記が混ざっているのが悪いので
1. T 表記に統一する (wcsncpy でなく _tcsncpy を使う)
2. W 表記に統一する (CString を使わないか T2CW を使う)
3. A 表記に統一する (旧式なので非推奨)
のどれか、ということになる。
ツイート | ![]() |