Mfc 将std::string值添加到CListBox最终会变得乱七八糟

Mfc 将std::string值添加到CListBox最终会变得乱七八糟,mfc,c++-cli,stdstring,clistbox,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")); __int

好吧,这个怎么了

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();
}
void CMFCApplication1Dlg::OnBnClickedOk()
{
向量向量表;
尝试
{
CMSAToolsilbrarywrapper;
__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());
}
}
}
捕获(com错误*e)
{
AfxMessageBox(“问题”);
}
//CDialogEx::OnOK();
}
如果在
AddString
上放置断点,则调用
strName
值是正确的。但是我的
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)
            {
                CString strName2(strName.c_str());
                m_lbNames.AddString(strName2);
            }

            UpdateData(FALSE);
        }
    }
    catch(_com_error *e)
    {
        AfxMessageBox(_T("Problem"));
    }
}
void CMFCApplication1Dlg::OnBnClickedOk()
{
向量向量表;
尝试
{
CMSAToolsilbrarywrapper;
__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 strnme2(strName.c_str());
mlbunames.AddString(strName2);
}
更新数据(假);
}
}
捕获(com错误*e)
{
AfxMessageBox(“问题”);
}
}

首先将
std::string
放入
CString
,然后通过
AddString
传递

char
字符串发送到需要
wchar\t
字符串的函数。
(LPCTSTR)
强制转换正在掩盖错误消息,该消息会告诉您错误所在。

请思考当
OnBnClickedOk
函数返回时会发生什么,并且
vectorList
变量超出范围,与所有包含的字符串一起被销毁。指针指向哪里?@Someprogrammerdude,但我正在用值填充一个CListBox。它不是模仿那些吗?我以前不必担心这一点。例如,我可以做
AddString(_T(“Fred”)
;字符串文字永远不会超出范围,它们的生命周期与整个程序相同,这就是为什么可以在任何地方使用指向它们的指针。至于listbox的问题,我认为它不会复制实际的字符串,但我不确定,而且我似乎找不到任何东西说明它是否复制。如果您将向量作为类的成员变量,或者以其他方式确保它不会被破坏,那么它能工作吗?@Ðаn-Huh?那是我的应答码吗?C++/CLI代码位于
CMSAToolsLibraryWrapper
包装器中。谢谢。此解决方案与原始问题或您的
CEdit
控件无关。这与您使用
CString
有关,它通过值传递并正确复制。您不再传递指向将被破坏的数据的指针。@Someprogrammerdude它确实相关。忘记CEdit代码吧。这是一个侧面。我的原稿是直接从std::string到listbox的。现在我用了CSreing。你的评论解释了为什么会这样。谢谢。@Someprogrammerdude我最初的问题不是一个
CEdit
控件。它在
CListBox
上使用
AddString
。谢谢。@Someprogrammerdude控件以任何方式复制字符串,因此在调用后销毁字符串并不重要。这样做的真正原因是
CString
内部包含
wchar\u t
字符,但会接受
char*
字符串,并在分配该字符串时进行转换。