void CWebMethod::OnDocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
經過多次測試,本函數並非主框架的完成最後一次調用.比如http://www.taobao.com如果有cookies被保存 主框架可能第二個就完成 然後這個函數還會被回調兩次.
多數如果無cookies的時候,都是在最後一次或者倒數第二次的回調是關於主框架的.
直接貼代碼
void CWebMethod::OnDocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
{
my_WebIsBusy = true;
if(BT_ByDialog == m_BrowserType)
{
if(m_StateEditCtr)ShowText(L"對話框",*m_StateEditCtr);
IUnknown* pUnk;
IDispatchPtr lpWBDisp;
HRESULT hr;
pUnk = my_pWebBrowserCtr->GetControlUnknown();
ASSERT(pUnk);
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr));
if (pDisp == lpWBDisp )
{
my_WebIsBusy=false;
TRACE("加載完成\r\n");
if(m_StateEditCtr)ShowText(L"對話框 總完",*m_StateEditCtr);
//EndModalLoop(0);
}
}
if(BT_ByIE == m_BrowserType)
{
if(m_StateEditCtr)ShowText(L"IE",*m_StateEditCtr);
LPDISPATCH pDis;
my_IEBrowser ->QueryInterface(IID_IDispatch, (void**)&pDis);
if(pDis == pDisp)
{
my_WebIsBusy=false;
TRACE("加載完成\r\n");
if(m_StateEditCtr)ShowText(L"IE 總完",*m_StateEditCtr);
}
}
}
其中
my_pWebBrowserCtr
爲MFC對話框內activex控件的變量的指針
my_IEBrowser是SHDOCVW的智能指針 shdocvw並不提供GetControlUnknown函數 而多數網上我們找的資料內 也只有這些說明 就是如同:
Unknown* pUnk;
IDispatchPtr lpWBDisp;
HRESULT hr;
pUnk = my_pWebBrowserCtr->GetControlUnknown();
ASSERT(pUnk);
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr));
if (pDisp == lpWBDisp )
{
//正式完成
}
IDispatchPtr lpWBDisp;
HRESULT hr;
pUnk = my_pWebBrowserCtr->GetControlUnknown();
ASSERT(pUnk);
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr));
if (pDisp == lpWBDisp )
{
//正式完成
}
Shdocvw的代碼或許更爲簡單一些 但是卻不那麼容易找到資料 比如找shdocvw的OnDocumentComplete 不易找到
以上只是說了一個方法 然而我更希望知道 OnDocumentComplete的可靠性 如前面我所說 程序判斷到的正式完成 往往不是最後一次回調這個函數
OnDocumentComplete
OnDocumentComplete