A2Wを使えるようにするには?


c初心者  2013-06-12 23:58:26  No: 73714

mfcで練習しています。
A2Wを使いたいのですが、
「 'CString' から 'LPCSTR' に変換できません。」とエラーが出ます。
調べたのですが、http://msdn.microsoft.com/ja-jp/library/87zae4a3(v=vs.80).aspx  で、「AtlBase.h, AtlConv.h (AtlConv.h 内で宣言)」とあります。
これの意味が解からないで困って降ります。
教えて頂けませんでしょうか。

よろしくお願いします。


Blue  2013-06-13 01:13:58  No: 73715

Visual Studioのバージョンはいくつですか?

>>「 'CString' から 'LPCSTR' に変換できません。」とエラーが出ます。
はどんな記述で出ますか?


c初心者  2013-06-13 01:24:35  No: 73716

Blueさん

Visual StudioのバージョンはVisual Studio2010です。

「wcsncpy(captureFile, A2W(m_captureFile), MAX_PATH);」の所で出てきます。

よろしくお願いします。


Blue  2013-06-13 01:35:27  No: 73717

wcsncpyならそのままいけるんじゃない?

wcsncpy(captureFile, m_captureFile, MAX_PATH);

ちなみに
>>A2W
は A(NSI文字列)をW(ide Char文字列)に変換する関数(マクロだっけ?)で
>>wcsncpy
は wcs(=Wide Char String)を引数にとるものです。


Blue  2013-06-13 01:38:43  No: 73718

ちなみに、プロジェクトのプロパティの文字セットが
「Unicode文字セットを使用する」
となっているときとしたときだと考えて発言しています。

CString=CStringW


c初心者  2013-06-13 01:49:03  No: 73719

Blueさん

おそらく、
http://msdn.microsoft.com/ja-jp/library/87zae4a3
の、「AtlBase.h, AtlConv.h (AtlConv.h 内で宣言)」部分だと思います。
2つともincludeしてみたのですが、変化はありませんでした。
よろしくお願いします。


Blue  2013-06-13 02:00:35  No: 73720

A2Wは絶対使わないとまずいのかということを問題にしたんですが・・・

>>「 'CString' から 'LPCSTR' に変換できません。」
は引数としている
>> m_captureFile
を A2W で欲する型である LPCSTR に変換できないというエラーです。

このエラーが出るということは、
>>プロジェクトのプロパティの文字セットが
>>「Unicode文字セットを使用する」
ということになっているわけで、
そもそもCStringを引数にとるなら、T2Wを使うべきで。

>>wcsncpy
を使う上で、Unicode文字セットのCStringの変数ならA2Wを使う必要性がまったくないわけで。

無理やり使うなら

CStringA hoge(m_captureFile)
wcsncpy(captureFile, A2W(hoge), MAX_PATH);

でいいんじゃね。
こんなコード後輩がかいてたら問い詰めるけどね。


tetrapod  2013-06-14 03:04:47  No: 73721

納得できたのだろうか・・・とりあえず、以下のことを覚えておくといい。
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 表記に統一する (旧式なので非推奨)
のどれか、ということになる。


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








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