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