📄 ieautomationview.cpp
字号:
{
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 + -