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*
字符串,并在分配该字符串时进行转换。