類內實現MFC/VC shdocvw IWebbrowser2的OnDocumentComplete等事件響應

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 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章