Подвисает обработка событий
От:
megasad
Дата: 12.06.05 11:05
Оценка:
Привет! Такая проблема
Пытаюсь подключиться к обработке событий DIID_DWebBrowserEvents через IConnectionPoint на чистом WINAPI без использования каки-либо библиотек.
Унаследовал от IDispatch класс:
class Event : public IDispatch
{
public:
Event() { m_cRef = 0; }
~Event() { ;}
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;
}
DWORD __stdcall AddRef()
{
return InterlockedIncrement(&m_cRef);
}
DWORD __stdcall Release()
{
if (InterlockedDecrement(&m_cRef) == 0){
delete this;
return 0;
}
return m_cRef;
}
STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo)
{
return E_NOINTERFACE;
}
STDMETHOD(GetTypeInfo)(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo)
{
return E_NOINTERFACE;
}
STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId)
{
return S_OK;
}
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
EXCEPINFO * pExcepInfo, UINT * puArgErr)
{
if (!pDispParams){
return E_INVALIDARG;
}
switch (dispIdMember){
case DISPID_ONQUIT:
break;
case DISPID_BEFORENAVIGATE2:{
break;}
default:{
break;}
}
return S_OK;
}
protected:
long m_cRef;
};
После чего передаю экземпляр этого класса в Advise следующим кодом:
IShellWindows *pShellWindows;
IDispatch *pDisp;
IWebBrowser2 *IE;
Event *ev;
CoInitialize(NULL);
hr=CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_INPROC_SERVER,IID_IShellWindows,(void**)&pShellWindows);
if(hr!=S_OK){
return 0;
}
LONG nCount;
pShellWindows->get_Count(&nCount);
for (int i=0; i<nCount; i++)
{
VARIANT v;
v.vt=VT_I4;
v.llVal=i;
hr=pShellWindows->Item(v,&pDisp);
if(hr!=S_OK){
return 0;
}
hr=pDisp->QueryInterface(IID_IWebBrowser2,(void**)&IE);
if(hr!=S_OK){
return 0;
}
ev=new Event;
hr=IE->QueryInterface(IID_IConnectionPointContainer,(void**)&ConnPtCont);
if(hr!=S_OK){
return 0;
}
ConnPtCont->FindConnectionPoint(DIID_DWebBrowserEvents,&ConnPt);
if(ConnPt){
ConnPt->Advise(ev,&Cookie);
ConnPt->Release();
}
}
do{
}while(1);
CoUninitialize();
После выполнения этого кода все окна эксплорера виснут. События в Invoke объекта Event неприходят.
После того как завершаю выполнение программы окна снова возвращаются в нормальное состояние.
Помогите кто может, перерыл уже весь MSDN и форум, но примера как делается на чистом WINAPI так и не нашел.
Чувствую тонкая какая-то трабла здесь есть.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить