我有一个成员变量声明为

CComPtr<IXMLDOMDocument2> m_spXMLDoc;

这样创建XML文档
CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
    IID_IXMLDOMDocument2, (void**)&m_spXMLDoc));

现在,当应用程序退出时,将引发异常。调用栈指向p->Release()
~CComPtrBase() throw()
{
   if (p)
      p->Release();
}

当我将鼠标悬停在VS调试器中的p时,它指向一些有效的内存。

最后一个调用栈指向msxm6中的异常
msxml6.dll!3d6cXX03()

有什么建议,可能是什么原因?我不认为这是CComPtr问题。

最佳答案

我遇到了类似的问题,最终我发现这只是一个错误。我必须确保在破坏CoUninitialize()之后调用CComPtr。否则,将会有异常(exception)。

int _tmain(int argc, _TCHAR* argv[]) {
  CoInitialize(NULL);
  mymain();
  //put all logic in a separate function so that CComPtr
  //is destructed before CoUninitialize()
  CoUninitialize();
  return 0;
}

在与CComPt调用相同的函数中声明CoUninitialize() r将导致异常,因为销毁发生在函数终止后。

关于CComPtr销毁期间的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3288264/

10-11 21:01