首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用IXMLDOMDocument的方法

正确使用IXMLDOMDocument的方法
EN

Stack Overflow用户
提问于 2013-09-11 07:37:54
回答 1查看 1K关注 0票数 0

我正在尝试使用IXMLDOMDocument进行XML读写。我不太好,我也不知道我做的是对是错。我很不确定COM初始化和relase是否存在一些问题。下面是我的代码,如果这里有任何可能的bug/内存泄漏,请告诉我。

代码语言:javascript
复制
void MyClass::ReadXML(BSTR *pVal)
{
    IXMLDOMDocument * pXMLDoc;
    IXMLDOMNode * pXDN;

    HRESULT hr = CoInitialize(NULL); 
    hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, 
       IID_IXMLDOMDocument, (void**)&pXMLDoc);

    if (SUCCEEDED(hr))
    {
        IXMLDOMNode* pEntityNode = CDOMHelpers::InsertDOMElement(pDoc, NULL, L"Person", NULL);

        if (SUCCEEDED(hr))
        {
            SomeClassObject->SerializeXML(pXMLDoc, pXDN);
            pXMLDoc->get_xml(pVal);
            pXDN->Release();       // Is this proper way to release COM?
            pXDN = NULL;
            pXMLDoc->Release();
            pXMLDoc = NULL;
        }
    }
}

void SomeOtherClass::SerializeXML(IXMLDOMDocument* pDoc, IXMLDOMNode* pXDN)
{
    CStringW text;
    IXMLDOMNode* pNewNode;

    text.Format(L"%u", Name);
    pNewNode = CDOMHelpers::InsertDOMElement(pDoc, pEntityNode, L"Name", text);

    text.Format(L"%u", Address);
    pNewNode = CDOMHelpers::InsertDOMElement(pDoc, pEntityNode, L"Address", text);
}
EN

回答 1

Stack Overflow用户

发布于 2013-09-11 09:48:10

MyClass::ReadXML中,调用CoInitialize是潜在的危险。当您不检查返回值时,调用方可能已经在这个线程上调用了它,这会导致问题。您需要为每个成功的CoUnInitialize调用CoInitialize

  • S_OK的意思是"OK",
  • S_FALSE的意思是"OK,已初始化“或
  • RPC_E_CHANGED_MODE的意思是“错误,不能更改为新模式”,并且引用计数不会增加。当您不主动要求分区模式或多线程模式时,您可以忽略这一点,但是当您这样做时,您不能调用CoUnInitialize

因此,最好的方法是一个RAII对象,它的c‘’tor调用CoInitialize并监视返回值,其d‘’tor只在需要时调用CoUnInitialize

参考资料:http://msdn.microsoft.com/en-us/library/windows/desktop/ms695279%28v=vs.85%29.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18735288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档