我有一个成员变量声明为
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
问题。
答案 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服务器。
结果 似乎 无法执行此版本,而是会出现服务器已断开连接的客户端等错误。