我正在尝试使用IXMLDOMDocument进行XML读写。我不太好,我也不知道我做的是对是错。我很不确定COM初始化和relase是否存在一些问题。下面是我的代码,如果这里有任何可能的bug/内存泄漏,请告诉我。
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);
}发布于 2013-09-11 09:48:10
在MyClass::ReadXML中,调用CoInitialize是潜在的危险。当您不检查返回值时,调用方可能已经在这个线程上调用了它,这会导致问题。您需要为每个成功的CoUnInitialize调用CoInitialize
CoUnInitialize。因此,最好的方法是一个RAII对象,它的c‘’tor调用CoInitialize并监视返回值,其d‘’tor只在需要时调用CoUnInitialize。
参考资料:http://msdn.microsoft.com/en-us/library/windows/desktop/ms695279%28v=vs.85%29.aspx
https://stackoverflow.com/questions/18735288
复制相似问题