请教各位如下问题:操作系统:XP
编译器用的是VC6.0
在系统目录下是可以搜索到MSXML4.dll我的头文件
#import <MSXML4.dll> named_guids
using  namespace  MSXML2;  
#include <atlbase.h>程序主体
{
HRESULT hr;
IXMLDOMDocumentPtr  spXMLDOM = NULL;
IXMLDOMNodePtr  pIDOMNode = NULL;

CoInitialize(NULL);

hr = spXMLDOM.CreateInstance(_uuidof(DOMDocument));

#if 0
/*解析过程*/
#endif

spXMLDOM->Release(); 
spXMLDOM = NULL; 

CoUninitialize();
}运行结果
1)在将解析过程注释掉的情况下会Down机.
2)打开解析过程,则在解析过程中Release pIDOMNode,并将pIDOMNode置为NULL时会Down机.
3)去掉spXMLDOM->Release()和spXMLDOM = NULL 还是会Down。请问何故?
谢谢!

解决方案 »

  1.   

    这个不需要你来设置Release,也不需要你来设置NULL.已经是一个COM智能指针了
      

  2.   

    可是去掉spXMLDOM->Release()和spXMLDOM = NULL 还是会Down。
      

  3.   

    HRESULT hr;

    CoInitialize(NULL);
    {
    MSXML2::IXMLDOMDocumentPtr  spXMLDOM = NULL;
    MSXML2::IXMLDOMNodePtr  pIDOMNode = NULL;
    hr = spXMLDOM.CreateInstance(_uuidof(MSXML2::DOMDocument)); spXMLDOM->loadXML(_bstr_t("<?xml version='1.0'?><node caption='hello'/>"));
    pIDOMNode=spXMLDOM->documentElement;
    MessageBox(NULL,pIDOMNode->attributes->getNamedItem(_bstr_t("caption"))->text,_T(""),0);
    }
    CoUninitialize();
    举个例子。你的spXMLDOM等会再CoUninitialize后面销毁,而那个时候由于已经执行了CoUnitialize,导致的问题
      

  4.   

    可是如果我的程序是
    {
    HRESULT hr;
    IXMLDOMDocumentPtr  spXMLDOM = NULL;
    IXMLDOMNodePtr  pIDOMNode = NULL;

    CoInitialize(NULL);

    hr = spXMLDOM.CreateInstance(_uuidof(DOMDocument));

    CoUninitialize();
    }
    还是会Down,这样我并没有自己Realease啊。
    谢谢!
      

  5.   

    具体情况具体分析。虽然spXMLDOM是智能指针,在函数返回时会自动释放引用。
    可是在函数返回之前,调用了CoUninitialize();释放了COM库,那么在这之后释放智能指针一般是要出错的了。==========================================
     我们的骄傲多半是基于我们的无知。——《莱辛寓言》
     CSDN助手 签名走马灯
      

  6.   

    你看这样会不会出错
    {
    CoInitialize(NULL);

    HRESULT hr;
    IXMLDOMDocumentPtr  spXMLDOM = NULL;
    IXMLDOMNodePtr  pIDOMNode = NULL;

    hr = spXMLDOM.CreateInstance(_uuidof(DOMDocument));
    if(spXMLDOM!=NULL)
    spXMLDOM.Release();

    CoUninitialize();
    }
    =================================================
     当你幸福的时候,切勿丧失使你成为幸福的德行。——莫罗阿
     CSDN助手 签名走马灯
      

  7.   

    那我还有一个疑问:象IXMLDOMNodePtr,IXMLDOMNamedNodeMapPtr和IXMLDOMNodeListPtr用完是不是也不需要自己释放,假如在一个程序中,IXMLDOMNamedNodeMapPtr类型的我会多次用到,我是否需要定义多个?
    谢谢!
      

  8.   

    你应该
    CoInitialize(NULL);
    {
     这里来声明 *****Ptr
    }
    CoUninitialize();
    这样来调用,来确保所有的COM对象的生存期都在CoInitialize和CoUninitialize内