关于xml和clistctrl配合使用的问题

rotApple 2008-04-15 11:13:23

目前我Load一个XML文档后, 循环主节, 把子节都存在了一个clistctrl的ITEM里面m_logList.SetItemData(maxCount,(DWORD_PTR)node.Detach());
注: 我用的是CXmlNodeWrapper类. Detach方法的内容是:m_xmlnode.Detach(); 返回的MSXML2::IXMLDOMNode*

然后删除所有ITEM, 按删除按钮:

int mark = m_logList.GetSelectionMark();
if(mark != -1)
{
if(MessageBox((LPCTSTR)m_pLanguage->GetString(IDS_WARNING_DELETEITEM),(LPCTSTR)m_pLanguage->GetString(IDS_APP_TITLE),MB_YESNO | MB_ICONQUESTION) != IDYES)
return;

CXmlNodeWrapper node((IDispatch *)m_logList.GetItemData(mark));
if(node.IsValid())
{
m_logList.DeleteItem(mark);
node.Parent()->removeChild(node.Interface());
m_xmlDoc.Save();
}
}


经常出错在GetItemData源码的VERIFY(::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)&lvi));这里.

我怀疑是XML自动释放了, 变成了NULL, 所以取不到了. 所以我想知道大家有没遇到过, 是XML自动释放引起的吗?
如何解决? 谢谢.
...全文
199 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rotApple 2008-04-21
  • 打赏
  • 举报
回复
已解决.
对着自己的代码看了很久, 然后想明白了.

在此留下解决方法, 方便别人来查吧:

由于MSXML2::IXMLDOMNodePtr 是智能指针, 智能指针是自动释放的, 所以如果你要传递它们, 绝对不能把它强转成普通指针, 如果那样它变成普通指针的时候就释放了.

所以我没有采用强转成DWORD_PTR存进CListCtrl的用户数据部分. 另外新建了一个CMap(用Vector也可以, 不过我想用CListCtrl的item的序号做名字方便点, 就用了CMap) 来存IXMLDOMNodePtr, 然后操作, 没有任何问题了.

代码:

CMap<long,int,IXMLDOMNodePtr,IXMLDOMNodePtr> m_allNodes;
// to do.

虽然这帖子这么多天了都没人帮我解决, 不过还是谢谢楼上二位了.

结帖.
socrates 2008-04-19
  • 打赏
  • 举报
回复
关注
ToperRay 2008-04-17
  • 打赏
  • 举报
回复
CXmlNodeWrapper node((IDispatch *)m_logList.GetItemData(mark));

这不是局部变量吗?
scq2099yt 2008-04-16
  • 打赏
  • 举报
回复
UP
rotApple 2008-04-16
  • 打赏
  • 举报
回复
没人?
rotApple 2008-04-15
  • 打赏
  • 举报
回复
node.Interface()方法内容是:return m_xmlnode; 类型MSXML2::IXMLDOMNode*

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧