在破坏CComPtr期间的异常

时间:2010-07-20 08:39:05

标签: exception visual-c++ com atl smart-pointers

我有一个成员变量声明为

CComPtr<IXMLDOMDocument2> m_spXMLDoc;

XML文档就是这样创建的

CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
    IID_IXMLDOMDocument2, (void**)&m_spXMLDoc));

现在,当应用程序退出时,会抛出异常。 Callstack指向p->Release()

~CComPtrBase() throw()
{
   if (p)
      p->Release();
}

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

最后一个callstack指向msxm6中的异常

msxml6.dll!3d6cXX03() 

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

4 个答案:

答案 0 :(得分:6)

我有类似的问题,最终我发现这只是一个错误。我必须确保在CoUninitialize()被破坏后调用CComPtr。否则,会有例外。

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将导致异常,因为在函数终止后发生了破坏。

答案 1 :(得分:1)

在程序退出之前执行此操作:

if( m_spXMLDoc.p )
    m_spXMLDoc.Release();

我在自己面前见过这个。这个问题与引用计数有关(显然),但我从不关心这个原因。希望这有帮助!

答案 2 :(得分:0)

您应该使用CComPtr的成员函数创建实例:

m_spXMLDoc.CoCreateInstance(...)

答案 3 :(得分:0)

我正在查看类似的问题,其中IExplorer从客户端下载当前网页的com服务器。
结果 似乎 无法执行此版本,而是会出现服务器已断开连接的客户端等错误。