小弟在VS2012中用C++编一个打开XML的程序中遇到了些问题。我打开XML的方法是通过打开一个索引XML文件(Index)然后获得子XML文件的路径,然后在根据这些路径用循环的方式打开子XML文件获取里面的信息。但是,我的程序不知道为什么出错,当子XML是只有一个时,程序就可以正常运行,当子XML是多个的时候,程序就提升出错,有数据中断。我设了断点查看错误原因,具体是在读完子XML,并进行完xmlfile.UnLoadXML()后,在退出循环的大括号时,自动跳到了comip.h下的
void _ Release() throw()
{
if(m_pInterface != NULL) {
m_pInterface->Release();
}
}
中断发生后,调用堆栈提示是 xmlIndex.exe!_com_ptr_t < com_IIID< MSXML2::IXMLDOMNode , &_GUID_2933bf80 > 处发生了中断。
我自己查了下资料,好像是com智能指针的释放出了问题,但是苦思几天还是没能找到解决方法,求大神们解救。
PS:我在使用CFileDlg弹出一个可以选择路径的对话框来选择IndexXML来打开IndexXML然后再用相同的方法打开子XML,上述代码是可以的,但是,我现在需要自动在指定的Index路径下通过上述代码打开XML,所以就出现了上述问题,再次恳请大神们解救啊。
具体代码如下:
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle=_T("可视化文件打开对话框");
if(IDOK==fileDlg.DoModal())
{
CXmlAnalysis xmlfileIndex;
xmlfileIndex.SetFileName(XMLIndexPath);
if(!xmlfileIndex.LoadXml())
return;
MSXML2::IXMLDOMNodePtr pRoot = NULL;
pRoot = xmlfileIndex.GetXmlRootNode();
if(NULL == pRoot)
return;
int iModuleCount = 0;
MSXML2::IXMLDOMNodePtr pParent = NULL;
iModuleCount = xmlfileIndex.GetXmlChildNodeCount(pRoot,_T("Root"));
pParent = NULL;
for(int j=0;j<=iModuleCount;j++)
{
int i=j+1;
pParent = xmlfileIndex.GetXmlChildNode(pRoot,_T("Parent"),j);
if(NULL == pParent)
return;
MSXML2::IXMLDOMNodePtr pNode = NULL;
//创建pNode节点
pNode = xmlfileIndex.GetXmlChildNode(pParent,_T("fileName"),0);
if(NULL == pNode)
return;
Root[i].fileName = xmlfileIndex.GetXmlNodeText(pNode);
pNode = xmlfileIndex.GetXmlChildNode(pParent,_T("filePath"),0);
//子XMLPath
if(NULL == pNode)
return;
m_XMLtemp = xmlfileIndex.GetXmlNodeText(pNode);
Root[i].filePath = m_XMLtemp;
pNode = xmlfileIndex.GetXmlChildNode(pParent,_T("fileKind"),0);
if(NULL == pNode)
return;
m_XMLtemp = xmlfileIndex.GetXmlNodeText(pNode);
int middle_fileKind;
m_XMLtemp=m_XMLtemp.Mid(1,2);
middle_fileKind=atoi(m_XMLtemp);
Root[i].fileKind=(WORD)middle_fileKind;
if(Root[i].ModuleKind==1)
{
CXmlAnalysis xmlfile1;
xmlfile1.SetFileName(Root[i].filePath);
if(!xmlfile1.LoadXml())
return;
MSXML2::IXMLDOMNodePtr pRootMod = NULL;
pRootMod = xmlfile1.GetXmlRootNode();
//创建pRootMod 指向XML文件1
if(NULL == pRootMod)
return;
MSXML2::IXMLDOMNodePtr pParentMod = NULL;
//创建pParentMod 指向Module节点
pParentMod = xmlfile1.GetXmlChildNode(pRootMod,_T("Module"),0);
if(NULL == pParentMod)
return;
MSXML2::IXMLDOMNodePtr pNodeMod = NULL;
//创建pNodeMod节点
pNodeMod = xmlfile1.GetXmlChildNode(pParentMod,_T("Name"),0);
if(NULL == pNodeMod)
return;
Node[i].Name = xmlfile1.GetXmlNodeText(pNodeMod);
xmlfile1.UnloadXml();
}
else if(Root[i].ModuleKind==2)
{
CXmlAnalysis xmlfile2;
xmlfile2.SetFileName(Root[i].filePath);
if(!xmlfile2.LoadXml())
return;
MSXML2::IXMLDOMNodePtr pRootMod = NULL;
pRootMod = xmlfile2.GetXmlRootNode();
//创建pRootMod 指向XML文件2
if(NULL == pRootMod)
return;
MSXML2::IXMLDOMNodePtr pParentMod = NULL;
//创建pParentMod 指向Module节点
pParentMod = xmlfile2.GetXmlChildNode(pRootMod,_T("Module"),0);
if(NULL == pParentMod)
return;
MSXML2::IXMLDOMNodePtr pNodeMod = NULL;
//创建pNodeMod节点
pNodeMod = xmlfile2.GetXmlChildNode(pParentMod,_T("Name"),0);
if(NULL == pNodeMod)
return;
Node[i].Name = xmlfile2.GetXmlNodeText(pNodeMod);
xmlfile2.UnloadXml();
}
}
xmlfileIndex.UnloadXml();
}