将std :: string值添加到CListBox最终会变成gbberish

时间:2017-03-13 15:40:07

标签: mfc c++-cli stdstring clistbox

好的,这有什么问题?

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最终会收到中文字符。为什么?

2 个答案:

答案 0 :(得分:3)

您正在向需要int sum = Enumerable.Range(0, n).Sum(); 字符串的函数发送char个字符串。 wchar_t强制转换掩盖了错误消息,告知您错误。

答案 1 :(得分:-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"));
    }
}

首先将std::string放入CString,然后将 AddString一起传递。