исключение при уничтожении CComPtr - PullRequest
5 голосов
/ 20 июля 2010

У меня есть переменная-член, объявленная как

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();
}

При наведении курсора на p в отладчике VS он указывает на некоторую действительную память.

Последний стек вызовов указывает на исключение в msxm6

msxml6.dll!3d6cXX03() 

Есть предложения, в чем может быть причина? Я не думаю, что это проблема CComPtr.

Ответы [ 4 ]

6 голосов
/ 04 августа 2011

У меня была похожая проблема, и в конце концов я обнаружил, что это просто ошибка. Я должен убедиться, что 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 r в той же функции, что и вызов CoUninitialize(), вызовет исключение, поскольку уничтожение происходит после завершения функции.

1 голос
/ 16 ноября 2010

Сделайте это до выхода из вашей программы:

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

Я видел это раньше.Проблема связана с подсчетом ссылок (очевидно), но я никогда не задумывался искать причину.Надеюсь, это поможет!

0 голосов
/ 09 ноября 2010

Я смотрю на похожую проблему, когда IExplorer разрывает com-сервер для текущей веб-страницы из-под клиентов.
В результате кажется , который может выпуститьне будет выполнено, вместо этого вы получите ошибки ком, как сервер отключил клиентов.

0 голосов
/ 12 августа 2010

Вы должны создать экземпляр, используя функции-члены CComPtr:

m_spXMLDoc.CoCreateInstance(...)
...