⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ieautomationview.cpp

📁 webbrowser
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{
	COleVariant vaZoomFactor(2l);

	ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
		   &vaZoomFactor, NULL);
}

void CIEAutomationView::OnViewFontsSmall()
{
	COleVariant vaZoomFactor(1l);

	ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
		   &vaZoomFactor, NULL);
}

void CIEAutomationView::OnViewFontsSmallest()
{
	COleVariant vaZoomFactor(0l);

	ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
		   &vaZoomFactor, NULL);
}


void CIEAutomationView::OnDestroy() 
{
	m_spHtmlDoc=NULL;
	CHtmlView::OnDestroy();
}

BOOL CIEAutomationView::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar) 
{
	USES_CONVERSION;
//Knowledge Base  
//PRB: Session ID Is Lost When You Close a Browser Window
	if (dispid == DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)
	{
		pvar->vt = VT_BOOL;
		pvar->boolVal = VARIANT_TRUE;

		return TRUE;
	}
//offline support
	if (dispid == DISPID_AMBIENT_DLCONTROL)
	{
		pvar->vt = VT_I4;
		if(m_bOffline)
			pvar->lVal |= DLCTL_FORCEOFFLINE;
		else
			pvar->lVal &= ~DLCTL_FORCEOFFLINE;
		return TRUE;
	} 
	return CHtmlView::OnAmbientProperty(pSite, dispid, pvar);
}
void	CIEAutomationView::ExecWBCommand(
	const GUID *pguidCmdGroup,  // Pointer to command group
	DWORD nCmdID,               // Identifier of command to execute
	DWORD nCmdExecOpt,          // Options for executing the command
	VARIANTARG *pvaIn,          // Pointer to input arguments
	VARIANTARG *pvaOut          // Pointer to command output
)
{
	if(m_pBrowserApp==NULL)return;
	CComQIPtr<IWebBrowser2>	pBrowserApp;
	pBrowserApp.p=m_pBrowserApp;
	m_pBrowserApp->AddRef();
	CComQIPtr<IOleCommandTarget> pCT(pBrowserApp);
	if(pCT){
		pCT->Exec(
			pguidCmdGroup,  // Pointer to command group
			nCmdID,               // Identifier of command to execute
			nCmdExecOpt,          // Options for executing the command
			pvaIn,          // Pointer to input arguments
			pvaOut          // Pointer to command output
		);
	}
}

void CIEAutomationView::OnEditFind() 
{
	ExecWBCommand(&CGID_WebBrowser,HTMLID_FIND,0,NULL,NULL);	
}

void CIEAutomationView::OnViewSource() 
{
	//ExecWBCommand(&CGID_WebBrowser,HTMLID_VIEWSOURCE,0,NULL,NULL);	
	if(m_spHtmlDoc==NULL)return;
	CComQIPtr<IHTMLDocument2>	pHtmlDoc(m_spHtmlDoc);
	CDlgDocOutline	DlgDocOutline;
	DlgDocOutline.m_pHtmlDoc=pHtmlDoc;
	DlgDocOutline.DoModal();
}

void CIEAutomationView::OnViewOption() 
{
	ExecWBCommand(&CGID_WebBrowser,HTMLID_OPTIONS,0,NULL,NULL);
/*
	typedef BOOL (WINAPI *LAUNCHCPL) (HWND);
	HMODULE hInetcpl;
	HWND hParent;
	LAUNCHCPL cpl;

	hInetcpl = LoadLibrary("inetcpl.cpl");

	if (hInetcpl == NULL)
	{
	   // Error loading module -- fail as securely as possible
	   return;
	}

	cpl = (LAUNCHCPL)GetProcAddress(hInetcpl, "LaunchInternetControlPanel");
	if(cpl)
	{
	  cpl(hParent);
	}
	FreeLibrary(hInetcpl);	*/
}
void CIEAutomationView::CallScriptDirect(IHTMLWindow2* pWindow2
		,BSTR bstrMethod)
{
	DISPID dispidScriptObject, dispidMethodToInvoke;
	IDispatch *pDispScriptObject;
	DISPPARAMS dispparamsNoArgs = { NULL, NULL, 0, 0};
	HRESULT hr;
	OLECHAR *szScript = L"script";
	OLECHAR *szFuncName = bstrMethod;
	
	IHTMLDocument2* pDocument2 = NULL;
	hr = pWindow2->get_document(&pDocument2);
	ASSERT(SUCCEEDED(hr) && pDocument2);

	IDispatch* pDocDisp = NULL;

	hr = pDocument2->QueryInterface(IID_IDispatch, (void**)&pDocDisp);
	ASSERT(SUCCEEDED(hr) && pDocDisp);

	// Get the DISPID of the document's Script property.
	hr = pDocDisp->GetIDsOfNames(IID_NULL, &szScript,
		1, LOCALE_USER_DEFAULT, &dispidScriptObject);
	ASSERT(SUCCEEDED(hr));

	COleVariant varResult;
	
	// Get the document's Script property.
	hr = pDocDisp->Invoke(dispidScriptObject,
		IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
		&dispparamsNoArgs, &varResult, NULL, NULL);
	ASSERT(SUCCEEDED(hr) && varResult.pdispVal);

	pDispScriptObject = varResult.pdispVal;

	varResult.Clear();	
	// Get the DISPID of the script method to invoke.
	hr = pDispScriptObject->GetIDsOfNames(IID_NULL, &szFuncName, 1, 
		LOCALE_USER_DEFAULT, &dispidMethodToInvoke);
	ASSERT(SUCCEEDED(hr));

	// Invoke the script method.
	hr = pDispScriptObject->Invoke(dispidMethodToInvoke, IID_NULL,
		LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, 
		&varResult, NULL, NULL);
	ASSERT(SUCCEEDED(hr));

	pDocDisp->Release();
	pDocument2->Release();

}
void CIEAutomationView::CallScript(IHTMLWindow2* pWindow2
		,BSTR bstrCode
		,BSTR bstrLanguage)
{
	ASSERT(pWindow2);
	HRESULT hr = S_OK;
	COleVariant ret;
	hr = pWindow2->execScript(bstrCode, bstrLanguage, &ret);
}

void CIEAutomationView::OnFileOffline() 
{
	m_bOffline=!m_bOffline;	
}

void CIEAutomationView::OnUpdateFileOffline(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bOffline);
	
}
// If a script is currently running, stop it
// else, start a script running based on the text in the edit control
void CIEAutomationView::RunScript() 
{
	CString strScriptText;
	EXCEPINFO    ei;
	HRESULT hr;

	if (m_bScriptIsRunning){
		// Close Script
		hr = m_axs->Close();
		do{
			if (FAILED(hr))	{
				TRACE("Attempt to Close AXS failed\n");
				break;
			}
			// NOTE: Handle OLESCRIPT_S_PENDING
			// The documentation reports that if you get this return value,
			// you'll need to wait until IActiveScriptSite::OnStateChange before
			// finishing the Close. However, no current script engine implementation
			// will do this and this return value is not defined in any headers currently
			// (This is true as of IE 3.01)

			if (m_axsp)	{
				m_axsp->Release();
				m_axsp = NULL;
			}
			if (m_axs)	{
				m_axs->Close();
				m_axs->Release();
				m_axs = NULL;
			}

			m_bScriptIsRunning = FALSE;
			return;
		}
		while(FALSE);
#ifndef DEBUG
		AfxMessageBox("Attempt to stop running script failed!\n");
#endif
	}
	else
	{
		if (!CreateEngine())
		{
#ifndef DEBUG
			AfxMessageBox("Failed to create script engine. Cannot execute script.");
#endif
			TRACE("Failed to create script engine. Cannot execute script.");
			return;
		}

		// Get text from edit control and PARSE IT DUDE!!
		strScriptText=GetDocument()->m_strScript;

		BSTR bstrParseMe = strScriptText.AllocSysString();

		m_axsp->ParseScriptText(bstrParseMe, L"Scripter", NULL, NULL, 0, 0, 0L, NULL, &ei);

		// Start the script running...
		hr = m_axs->SetScriptState(SCRIPTSTATE_CONNECTED);
		if (FAILED(hr))
		{
			TRACE("SetScriptState to CONNECTED failed\n");
		}

		// Change Button Text to "&Stop Script"
		//m_wndRunScript.SetWindowText("&Stop Script");
		m_bScriptIsRunning = TRUE;
	}
}
/////////////////////////////////////////////////////////////////////////////
// CIEAutomationView Faked CreateObject implementation

LPDISPATCH CIEAutomationView::HostCreateObject(const VARIANT FAR& bstrProgID) 
{
	USES_CONVERSION;

	HRESULT hr = S_OK;
	LPDISPATCH retval = NULL;
	TRACE( "Calling HostCreateObject()\n" );

	if (VT_BSTR != bstrProgID.vt)
	{
		AfxThrowOleException(E_INVALIDARG);
	}

	CLSID clsidObject;
	hr = CLSIDFromProgID( (LPCOLESTR)bstrProgID.pbstrVal, &clsidObject );
	if( SUCCEEDED( hr ) )
	{
		hr = CoCreateInstance( clsidObject, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&retval );
		if (FAILED(hr))
		{
			CString strProgID;
			strProgID = (BSTR)bstrProgID.pbstrVal;
			TRACE("Failed to create object '%s'.\nReturn = 0x%x\n",strProgID,hr);
			AfxThrowOleException(E_FAIL);
		}
	}
	else
	{
		CString strProgID;
		strProgID = (BSTR)bstrProgID.pbstrVal;
		TRACE("Invalid ProgID '%s'\n",strProgID);
		AfxThrowOleException(E_INVALIDARG);
	}

	return retval;
}

BOOL CIEAutomationView::CreateEngine()
{
	HRESULT hr;

	// XX ActiveX Scripting XX 
	hr = CoCreateInstance(CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER, IID_IActiveScript, (void **)&m_axs);
	if (FAILED(hr))
		// If this happens, the scripting engine is probably not properly registered
		return FALSE;
	// Script Engine must support IActiveScriptParse for us to use it
	hr = m_axs->QueryInterface(IID_IActiveScriptParse, (void **)&m_axsp);
	if (FAILED(hr))
		goto Failure;
	hr = m_axs->SetScriptSite(&m_xActiveScriptSite); // Our MFC-OLE interface implementation
	if (FAILED(hr))
		goto Failure;
	// InitNew the object:
	hr = m_axsp->InitNew();
	if (FAILED(hr))
		goto Failure;

	mapNamedItems[_T("Scripter")] = this;
	// Add Top-level Global Named Item
	hr = m_axs->AddNamedItem(L"Scripter", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE | SCRIPTITEM_GLOBALMEMBERS);
	if (FAILED(hr))
		TRACE("Couldn't add named item Scripter\n");

	// NOTE: Here's a tricky point in the scripting object model stuff
	// Technically, all a scripting host needs to do is expose the top level items
	// in its hierarchy. In our case, thats the Scripter object, since all of the following
	// are available as properties in the Scripter IDispatch interface.
	// We do not need to add these as named items for script code such as
	// 'LBox.AddString "Hi There"'
	// to work without doing 'Scripter.LBox.AddString "Hi There"'
	// However! script engines will only set up sinks for Named Items. So if you
	// want an item to be able to support event-handling such as
	// "Sub LBox_OnMouseOver"
	// you must add that item as a Named Item. In this case, everything on the dialog
	// generates events that we might want to script, so we add all items as named
	// items.
	// Web Browser Control
	mapNamedItems[_T("WebBrowser")] = &m_wndBrowser;
	hr = m_axs->AddNamedItem(L"WebBrowser", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE);
	if (FAILED(hr))
		TRACE("Couldn't add named item BroCon\n"); 
	//External
	mapNamedItems[_T("External")] = &m_domExternal;
	hr = m_axs->AddNamedItem(L"External", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE);
	if (FAILED(hr))
		TRACE("Couldn't add named item External\n");

	return TRUE;

Failure:
	if (m_axs)
		m_axs->Release();
	if (m_axsp)
		m_axsp->Release();

	// XX ActiveX Scripting XX
	return FALSE;
}

LPDISPATCH CIEAutomationView::GetWebBrowser() 
{
	// no dispatch pointer yet; find it now
	LPDISPATCH pDispatch = NULL;
	LPUNKNOWN pUnkControl = m_wndBrowser.GetControlUnknown();

	if ((pUnkControl != NULL) &&
		SUCCEEDED(pUnkControl->QueryInterface(IID_IDispatch, (LPVOID*)&pDispatch)))
	{
		ASSERT(pDispatch != NULL);
	}
	else
	{
		TRACE("Failed to obtain dispatch for Web Browser Control");
	}

	return pDispatch;
}


void CIEAutomationView::OnScriptEdit() 
{
	// TODO: Add your command handler code here
	CDlgInputText	dlg;
	dlg.m_strText=GetDocument()->m_strScript;

	if(dlg.DoModal()!=IDOK)return;

	GetDocument()->m_strScript=dlg.m_strText;
}

void CIEAutomationView::OnUpdateScriptEdit(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(!m_bScriptIsRunning);	
}

void CIEAutomationView::OnScriptRun() 
{
	RunScript();	
}

void CIEAutomationView::OnUpdateScriptRun(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bScriptIsRunning);
	
}

void CIEAutomationView::OnFavoritesAdd() 
{
	CComQIPtr<IHTMLDocument2>	pHtmlDoc(m_spHtmlDoc);
	if(pHtmlDoc==NULL)
		return;
	CComBSTR bstrTitle,bstrURL;
	if(FAILED(pHtmlDoc->get_title(&bstrTitle)))return;
	if(FAILED(pHtmlDoc->get_URL(&bstrURL)))return;
	COleVariant	varTitle(CString(bstrTitle.m_str));
	m_domExternal.AddFavorite(CString(bstrURL),varTitle);
}

void CIEAutomationView::OnFavoritesManage() 
{
	COleVariant vMissing(DISP_E_PARAMNOTFOUND,VT_ERROR);
	m_domExternal.ShowBrowserUI(_T("OrganizeFavorites"),vMissing);	
}
//override to redirect BeforeNavigate2 event
void CIEAutomationView::BeforeNavigate2(LPDISPATCH  pDisp , VARIANT* URL,
		VARIANT* Flags, VARIANT* TargetFrameName,
		VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
{
	m_domExternal.FireBeforeNavigate2(pDisp , URL,
		Flags, TargetFrameName,
		PostData, Headers, Cancel);
	ASSERT(V_VT(URL) == VT_BSTR);
	ASSERT(V_VT(TargetFrameName) == VT_BSTR);
	ASSERT(V_VT(PostData) == (VT_VARIANT | VT_BYREF));
	ASSERT(V_VT(Headers) == VT_BSTR);
	ASSERT(Cancel != NULL);

	USES_CONVERSION;

	VARIANT* vtPostedData = V_VARIANTREF(PostData);
	CByteArray array;
	if (V_VT(vtPostedData) & VT_ARRAY)
	{
		// must be a vector of bytes
		ASSERT(vtPostedData->parray->cDims == 1 && vtPostedData->parray->cbElements == 1);

		vtPostedData->vt |= VT_UI1;
		COleSafeArray safe(vtPostedData);

		DWORD dwSize = safe.GetOneDimSize();
		LPVOID pVoid;
		safe.AccessData(&pVoid);

		array.SetSize(dwSize);
		LPBYTE lpByte = array.GetData();

		memcpy(lpByte, pVoid, dwSize);
		safe.UnaccessData();
		AutoCompleteSaveForm(pDisp);
	}
	// make real parameters out of the notification

	CString strTargetFrameName(V_BSTR(TargetFrameName));
	CString strURL = V_BSTR(URL);
	CString strHeaders = V_BSTR(Headers);
	DWORD nFlags = V_I4(Flags);

	// notify the user's class
	OnBeforeNavigate2(strURL, nFlags, strTargetFrameName,
		array, strHeaders, Cancel);
}
void	CIEAutomationView::AutoCompleteSaveForm(LPDISPATCH pDisp)
{
	#pragma message(__LOC__"not working,why?Need m_pShellUIHelper->AutoCompleteAttatch?\r\n") 
	CComQIPtr<IWebBrowser2>	pWebBrowser2(pDisp);
	CComPtr<IDispatch>	spHtmlDoc;
	if(FAILED(pWebBrowser2->get_Document(&spHtmlDoc)))	return;
	CComQIPtr<IHTMLDocument2>	pHtmlDoc(spHtmlDoc);
	CComPtr<IHTMLElement>	pElement;
	if(FAILED(pHtmlDoc->get_activeElement(&pElement))||pElement==NULL)	return;
	while(pElement){
		CComQIPtr<IHTMLFormElement>	pForm(pElement);
		if(pForm){
			CComQIPtr<IDispatch>	spForm(pForm);
			COleVariant var;
			var.vt=VT_DISPATCH;
			var.pdispVal=spForm;
			m_domExternal.AutoCompleteSaveForm(var);
			break;
		}
		CComPtr<IHTMLElement>	pParentElement;
		if(FAILED(pElement->get_parentElement(&pParentElement))||pParentElement==NULL)
			break;
		pElement=pParentElement;
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -