总的来说,这方面的问题已经在MSDN上发了多次……我本人水平不高,大家给的很多好的方案都看不明白或者不知道如何实现……整的我很无奈……前面的问题都凑合着混过去了,现在又来了……
代码如下:
建立窗体
m_hWeb = CreateWindowEx(
WS_EX_TOOLWINDOW,
"AtlAxWin90",
"Shell.Explorer.2",
WS_POPUP | WS_VISIBLE ,
m_nLeft,
m_nTop,
m_nWidth,
m_nHeight,
NULL,
NULL,
NULL,
NULL
);
获取IWebBrowser2
CComQIPtr<IWebBrowser2> m_pIE;
lAtlRet = AtlAxGetControl(m_hWeb, &pDef);
if (lAtlRet != S_OK)
{
return FALSE;
}
m_pIE = pDef;
if (m_pIE == NULL)
{
return FALSE;
}
实现 IDispatch接口
interface IWebEvent : public IDispatch
{
public:
HANDLE m_hEventHandle;
IDispatch* m_IDispatch;
void setIDispatch(IDispatch* IDispatch)
{
m_IDispatch = IDispatch;
}
void setHandle(HANDLE handle)
{
m_hEventHandle = handle;
}
//IDispatch
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject)
{
if(IsEqualIID(iid, IID_IUnknown)||
IsEqualIID(iid, IID_IDispatch)||
IsEqualIID(iid, DIID_DWebBrowserEvents2))
{
*ppvObject = this;
}
else
{
*ppvObject = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
ULONG STDMETHODCALLTYPE AddRef(void)
{
return 1;
}
ULONG STDMETHODCALLTYPE Release(void)
{
return 0;
}
HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo)
{
if (ppTInfo == NULL)
{
return E_INVALIDARG;
}
*ppTInfo = NULL;
if(iTInfo != 0)
{
return DISP_E_BADINDEX;
}
return S_OK;
}
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR* pctinfo)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr)
{
switch(dispIdMember)
{
case DISPID_DOCUMENTCOMPLETE://DocumentComplete
char buff[256];
memset(buff,0,256);
wcstombs(buff,pDispParams->rgvarg[0].pvarVal->bstrVal,256);
if (m_IDispatch == (IDispatch*)pDispParams->rgvarg[1].ppdispVal)
{
SetEvent(m_hEventHandle);
}
break;
default:
break;
}
return S_OK;
}
};
设置链接点
m_hDocComplete = CreateEvent(NULL, FALSE, FALSE, NULL);
m_cWebEvent = new IWebEvent();
m_cWebEvent->QueryInterface(IID_IDispatch, (void **)&m_cWebEvent);
m_cWebEvent->setHandle(m_hDocComplete);
IConnectionPointContainer *spCPC;
hRet = m_pIE->QueryInterface(IID_IConnectionPointContainer,(void**)&spCPC);
if(FAILED(hRet))
{
MessageBox(NULL, "m_pIE->QueryInterface", "m_pIE->QueryInterface", NULL);
}
IConnectionPoint *spCP;
hRet = spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&spCP);
if(FAILED(hRet))
{
MessageBox(NULL, "spCPC->FindConnectionPoint", "spCPC->FindConnectionPoint", NULL);
}
DWORD cookie;
hRet = spCP->Advise(m_cWebEvent, &cookie);
if(FAILED(hRet))
{
MessageBox(NULL, "spCP->Advise", "spCP->Advise", NULL);
}
m_pIE->QueryInterface(IID_IDispatch,(void**)&lpWBDisp);
m_cWebEvent->setIDispatch(lpWBDisp);
等待 DOCUMENTCOMPLETE事件中设置的EVENT
CComVariant vUrl(chHtmlFileNameBuffer);
CComVariant vEmpty;
hRet = m_pIE->put_Visible(VARIANT_TRUE);
if (hRet != S_OK)
{
return FALSE;
}
hRet = m_pIE->Navigate2(&vUrl, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
if (hRet != S_OK)
{
return FALSE;
}
if (g_hTopMost == m_hWeb)
{
return TRUE;
}
WaitForSingleObject(m_hDocComplete, INFINITE);
问题现象:
在这个建立的IWebBrowser2上重复显示同一个HTML面(不是刷新,就只是重复的去执行 Navigate2那段程序 )。速度会越来越慢,比如IE6的话,一个CSS特效很多的HTML在一开始大概需要1秒加载完毕,但几百次以后会变成10秒多。这个时候如果换个简单页面显示一次,然后再加载之前的页面,速度又恢复了。如果把CSS干掉,速度确实会上升,但这个方案肯定不会通过的……
换IE7和IE8之后貌似没有问题。但是由于指定的就是IE6,所以很纠结……
至于为什么会连续几百次显示同一个页面,我只能说最终用户很SB,有这种操作的需求……
各位高人啊,有什么可以改动或者优化的地方没有?要给整崩溃了……