Tomek.Sergey
April 5th, 2006, 07:58 AM
There is a class like this:
class CWebBrowser2 : public IDispatch
{
// IUnknown
virtual HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObject)
{
*ppvObject = NULL;
if (IsEqualGUID(riid, IID_IUnknown))
*ppvObject = reinterpret_cast<void**>(this);
if (IsEqualGUID(riid, IID_IDispatch))
*ppvObject = reinterpret_cast<void**>(this);
if (*ppvObject)
{
((IUnknown*)*ppvObject)->AddRef();
return S_OK;
}
else return E_NOINTERFACE;
}
virtual ULONG __stdcall AddRef() { return 1; }
virtual ULONG __stdcall Release() { return 1;}
// IDispatch
virtual HRESULT __stdcall GetTypeInfoCount(unsigned int FAR* pctinfo) { return E_NOTIMPL; }
virtual HRESULT __stdcall GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo) { return E_NOTIMPL; }
virtual HRESULT __stdcall GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId) { return S_OK; }
virtual HRESULT __stdcall Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr);
void BeforeNavigate2( IDispatch* pDisp,
VARIANT* url,
VARIANT* Flags,
VARIANT* TargetFrameName,
VARIANT* PostData,
VARIANT* Headers,
VARIANT* Cancel);
void DocumentComplete(VARIANT *vDisp,VARIANT *vUrl);
private:
DWORD m_dwCookie;
CComPtr<IWebBrowser2> m_pWB2;
char szLogin[100];
char szPassword[100];
public:
CWebBrowser2(char *login,char *password) : m_dwCookie(0)
{
strcpy(szLogin,login);
strcpy(szPassword,password);
::CoInitializeEx(NULL,COINIT_MULTITHREADED);
}
~CWebBrowser2()
{
Disconnect();
::CoUninitialize();
}
bool IsTopFrame(LPDISPATCH pDisp);
bool Connect()
{
if( FAILED(::CoCreateInstance(CLSID_InternetExplorer, 0, CLSCTX_ALL, IID_IWebBrowser2, (void**)&m_pWB2)) )
return false;
CComPtr<IUnknown> pUnk;
if( FAILED(m_pWB2->QueryInterface(IID_IUnknown, (void**)&pUnk)) )
return false;
if( FAILED(AtlAdvise(pUnk, static_cast<IDispatch*>(this), DIID_DWebBrowserEvents2, &m_dwCookie)) )
return false;
return true;
}
bool Disconnect()
{
CComPtr<IUnknown> pUnk;
if( FAILED(m_pWB2->QueryInterface(IID_IUnknown, (void**)&pUnk)) )
return false;
if( FAILED(AtlUnadvise(pUnk, DIID_DWebBrowserEvents2, m_dwCookie)) )
return false;
return true;
}
IWebBrowser2* operator-> () const
{
return m_pWB2;
}
private:
};
Instances are created this way:
unsigned WINAPI ThFunc(void*){
CWebBrowser2 *pTemp=new CWebBrowser2(g_szUserid,g_szPassword);
SetEvent(hEvent);
if(!pTemp->Connect()) {
delete pTemp;
return -1;
}
pointers.push_back(pTemp);
CComVariant vUrl(L"http://test2.ru/");
VARIANT vFlags = {0}, vTargetFrameName = {0}, vPostData = {0}, vHeaders = {0};
(*pTemp)->Navigate2(&vUrl,&vFlags,&vTargetFrameName,&vPostData,&vHeaders);
return 0;
}
Actually I create two instances by calling _beginthreadex two times.
After 2 sec my app gets an exception, and if I run in debug mode, two debug error windows are shown. First saying about unexpected memory corruption in thread and second says about insufficient memory in a thread. In general, I cannot do anything with IE in a thread - app is down. Has anybody such behaviour ?
class CWebBrowser2 : public IDispatch
{
// IUnknown
virtual HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObject)
{
*ppvObject = NULL;
if (IsEqualGUID(riid, IID_IUnknown))
*ppvObject = reinterpret_cast<void**>(this);
if (IsEqualGUID(riid, IID_IDispatch))
*ppvObject = reinterpret_cast<void**>(this);
if (*ppvObject)
{
((IUnknown*)*ppvObject)->AddRef();
return S_OK;
}
else return E_NOINTERFACE;
}
virtual ULONG __stdcall AddRef() { return 1; }
virtual ULONG __stdcall Release() { return 1;}
// IDispatch
virtual HRESULT __stdcall GetTypeInfoCount(unsigned int FAR* pctinfo) { return E_NOTIMPL; }
virtual HRESULT __stdcall GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo) { return E_NOTIMPL; }
virtual HRESULT __stdcall GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId) { return S_OK; }
virtual HRESULT __stdcall Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr);
void BeforeNavigate2( IDispatch* pDisp,
VARIANT* url,
VARIANT* Flags,
VARIANT* TargetFrameName,
VARIANT* PostData,
VARIANT* Headers,
VARIANT* Cancel);
void DocumentComplete(VARIANT *vDisp,VARIANT *vUrl);
private:
DWORD m_dwCookie;
CComPtr<IWebBrowser2> m_pWB2;
char szLogin[100];
char szPassword[100];
public:
CWebBrowser2(char *login,char *password) : m_dwCookie(0)
{
strcpy(szLogin,login);
strcpy(szPassword,password);
::CoInitializeEx(NULL,COINIT_MULTITHREADED);
}
~CWebBrowser2()
{
Disconnect();
::CoUninitialize();
}
bool IsTopFrame(LPDISPATCH pDisp);
bool Connect()
{
if( FAILED(::CoCreateInstance(CLSID_InternetExplorer, 0, CLSCTX_ALL, IID_IWebBrowser2, (void**)&m_pWB2)) )
return false;
CComPtr<IUnknown> pUnk;
if( FAILED(m_pWB2->QueryInterface(IID_IUnknown, (void**)&pUnk)) )
return false;
if( FAILED(AtlAdvise(pUnk, static_cast<IDispatch*>(this), DIID_DWebBrowserEvents2, &m_dwCookie)) )
return false;
return true;
}
bool Disconnect()
{
CComPtr<IUnknown> pUnk;
if( FAILED(m_pWB2->QueryInterface(IID_IUnknown, (void**)&pUnk)) )
return false;
if( FAILED(AtlUnadvise(pUnk, DIID_DWebBrowserEvents2, m_dwCookie)) )
return false;
return true;
}
IWebBrowser2* operator-> () const
{
return m_pWB2;
}
private:
};
Instances are created this way:
unsigned WINAPI ThFunc(void*){
CWebBrowser2 *pTemp=new CWebBrowser2(g_szUserid,g_szPassword);
SetEvent(hEvent);
if(!pTemp->Connect()) {
delete pTemp;
return -1;
}
pointers.push_back(pTemp);
CComVariant vUrl(L"http://test2.ru/");
VARIANT vFlags = {0}, vTargetFrameName = {0}, vPostData = {0}, vHeaders = {0};
(*pTemp)->Navigate2(&vUrl,&vFlags,&vTargetFrameName,&vPostData,&vHeaders);
return 0;
}
Actually I create two instances by calling _beginthreadex two times.
After 2 sec my app gets an exception, and if I run in debug mode, two debug error windows are shown. First saying about unexpected memory corruption in thread and second says about insufficient memory in a thread. In general, I cannot do anything with IE in a thread - app is down. Has anybody such behaviour ?