2017-03-13 8 views
0

これは何が問題なのですか?std :: string値をCListBoxに追加すると、gbberishとして終了する

void CMFCApplication1Dlg::OnBnClickedOk() 
{ 
    std::vector<std::string> vectorList; 

    try 
    { 
     CMSAToolsLibraryWrapper wrapper; 

     __int64 lResult = wrapper.SetDatabasePath(std::string("d:\\Test.xml")); 
     __int64 iNumPublishersRead = 0; 
     if (wrapper.ReadPublisherData(iNumPublishersRead)) 
     { 
      vectorList = wrapper.GetPersonnelNames(true); 
      for (std::string& strName : vectorList) 
      { 
       m_lbNames.AddString((LPCTSTR)strName.c_str()); 
      } 
     } 
    } 
    catch(_com_error *e) 
    { 
     AfxMessageBox(_T("Problem")); 
    } 

    //CDialogEx::OnOK(); 
} 

私はAddString呼び出しにブレークポイントを配置する場合strName値が正しいです。しかし、私のCListBoxは漢字で終わる。どうして ?

+0

'OnBnClickedOk'関数が復帰し、' vectorList'変数がスコープから外れ、すべての含まれている文字列と共に破壊されたときを考えてみましょう。ポインターはどこを指していますか? –

+0

@Someprogrammerdudeしかし、私はCListBoxに値を設定しています。それらをコピーしないのですか?以前はそれについて心配する必要はありませんでした。たとえば、私は 'AddString(_ F(" Fred "))'を実行している可能性があります。 –

+0

文字列リテラルはスコープから外に出ることはありません。その生涯はフルプログラムと同じです。そのため、どこにでもポインタを使用できます。リストボックスの問題については、実際の文字列をコピーするとは思っていませんが、わかりません。もしそうであれば、何も言わないようです。ベクタをクラスのメンバ変数にするか、そうでなければ破壊されないことを確認したら、それは動作しますか? –

答えて

3

char文字列には、wchar_t文字列が必要な関数に文字列を送ります。 (LPCTSTR)キャストは、何が間違っているかを教えてくれたエラーメッセージをマスクしています。

+0

ありがとうございます。 –

-1

これは動作します:

void CMFCApplication1Dlg::OnBnClickedOk() 
{ 
    std::vector<std::string> vectorList; 

    try 
    { 
     CMSAToolsLibraryWrapper wrapper; 

     __int64 lResult = wrapper.SetDatabasePath(std::string("d:\\Test.xml")); 
     __int64 iNumPublishersRead = 0; 

     if (wrapper.ReadPublisherData(iNumPublishersRead)) 
     { 
      vectorList = wrapper.GetPersonnelNames(true); 
      for (std::string& strName : vectorList) 
      { 
       CString strName2(strName.c_str()); 
       m_lbNames.AddString(strName2); 
      } 

      UpdateData(FALSE); 
     } 
    } 
    catch(_com_error *e) 
    { 
     AfxMessageBox(_T("Problem")); 
    } 
} 

CString最初にしを渡すことAddStringと作品にstd::stringを置きます。

+2

この解決策は、元の問題または 'CEdit'コントロールとは何の関係もありません。 'CString'を代わりに使用しなければなりません。これはvalue *によって渡され、正しくコピーされます。あなたはもはや破壊されるデータへのポインタを渡すことはありません。 –

+0

@Someprogrammerdudeそれは関連しています。 CEditコードを忘れてしまった。それは側面です。私のオリジナルはstd :: stringからlistboxへ直接だった。そして今私はCSreingを使いました。あなたのコメントは、なぜそれが動作するかを説明します。ありがとう。 –

+0

@Someprogrammerdude私の元の問題は 'CEdit'コントロールではありませんでした。それは 'ClistBox'に' AddString'を使っていました。ありがとう。 –

関連する問題