Иллюстрирующий проблему код
- Код: Выделить всё
#include <tchar.h>
#include <MsHTML.h>
//see http://support.microsoft.com/kb/231931
#pragma warning(disable : 4049)
#pragma warning(disable : 4146)
#pragma warning(disable : 4192)
#pragma warning(disable : 4278)
#import <mshtml.tlb>
#pragma warning(default: 4049)
#pragma warning(default: 4146)
#pragma warning(default: 4192)
#pragma warning(default: 4278)
int _tmain(int argc, TCHAR *argv[])
{
HRESULT hr = CoInitialize(NULL);
if(FAILED(hr))
return -1;
MSHTML::IHTMLDocument2Ptr pDoc = NULL;
MSHTML::IHTMLDocument3Ptr pDoc3 = NULL;
hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER,
IID_IHTMLDocument2, (void**)&pDoc);
if(FAILED(hr))
return -1;
//Access violation reading location
//if(pDoc)
// pDoc->Release();
//pDoc = NULL;
CoUninitialize();
return 0;
//Access violation reading location
//and go to COM interface pointers header (comip.h)
}
В таком виде, программа заканчивает работу с исключением после return 0.
При запуске из-под Visual C++ (тестировалось в Express Edition 2008/2010) сваливается на освобождении COM интерфейса в файле comip.h
Если используемый интерфейс освобождать самостоятельно, то во время выполнения в окне OutPut будет поступать информация о множественных Access violation reading location.
Если поменять местами CoUninitialize() и освобождение (pDoc->Release()), как приводил пример Андре Ламот по другому COM интерфейсу, то исключение на этом освобождении.
Как быть?