2016-06-30 15 views
0

関数にLPWSTRするのstd ::文字列を変換置くことができませんCListCtrlLVITEM::pszTextAfxMessageBoxのようないくつかのMFCオブジェクトのプロパティを使用するLPWSTRに、...だから私は、インターネットからこのsnipsetを使用します。MFC:私は</p> <p><br/>私は<code>std::string</code>から変換する必要がある「使用Unicode文字セット」には、Visual Studioの2015年、文字セットの設定によってMFCプロジェクトを書いて

String str = "Hello world!"; 
std::wstring wname(str.begin(), str.end()); 
LPWSTR lStr = const_cast<wchar_t*>(wname.c_str()); 
MessageBox(lStr); 

このアプローチの作業罰金。しかし、問題は、すべての時間が私はこれらの文を書き直す必要があります変換する必要があり、私は関数にこのsnipsetを置くことである:

LPWSTR convertLPWSTR(std::string &str) { 
    std::wstring wname(str.begin(), str.end()); 
    return const_cast<wchar_t*>(wname.c_str()); 
} 
/... 
String str = "Hello world!"; 
LPWSTR lStr = convertLPWSTR(str); 
MessageBox(lStr); 

しかし、メッセージボックスの出力(エラーフォントのような)エラー文字列

これを修正する方法を知っている人はいますか?ありがとう!

+0

を使用していない私はあなたの実装に[リンク](http://stackoverflow.com/a/27296/6460438) – Greg

+3

いくつかの注意事項を使用することをお勧めします: '1'それを単純にデータ型を広げて(文字**のエンコーディング**を完全に無視して)狭い文字列からワイド文字列を構築するという習慣は殺すのが難しいようです。それをやめてください。あなたが期待したとおりに動作しません。 '2'あなたの' convertLPWSTR'実装はロ​​ーカルオブジェクトへのポインタを返します。それは未定義の動作です。 '3''解答は簡単です:' MessageBox(CString(str.c_str())); ' – IInspectable

+3

' wstring'、 'LPWSTR'、' c_str'は何ですか、試行錯誤してプログラミングしていますか? – immibis

答えて

-2

なぜあなたは

CString str = _T("Hello world!") ; 
+0

これは 'std :: string'から変換しません(あなたがdownvoteについて不思議な場合に備えて)。 – IInspectable

+0

質問は* "私は' std :: string'を使うべきですか? "*。質問は* "私は' std :: string'を持っていて、ワイド文字列に変換する必要があります。どうすればいいですか?*どういうわけか、私はなぜコメントを残して、なぜ答えを落としたのか説明しません。それは常にそれを二度説明することにつながります。 – IInspectable

関連する問題