HRESULT __stdcall DWebBrowserEventsImpl::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr) { // proces OnBeforeNavigate if (dispIdMember == DISPID_BEFORENAVIGATE) { BeforeNavigate( _bstr_t( pDispParams->rgvarg[5].bstrVal ), 0, _bstr_t( pDispParams->rgvarg[3].bstrVal ), NULL, _bstr_t(""), NULL); } else if (dispIdMember == DISPID_NAVIGATECOMPLETE) { NavigateComplete( _bstr_t( pDispParams->rgvarg[0].bstrVal ) ); } return NOERROR; }
long CLauncherWindow::OnNotify(WPARAM wparam, NMHDR* hdr) { if(CWindow::IsNotifySource(&m_webBrowser, hdr)) { switch(hdr->code) { case Framework::Win32::CWebBrowser::NOTIFICATION_BEFORENAVIGATE: BeforeNavigate(static_cast<Framework::Win32::CWebBrowser::BEFORENAVIGATE_INFO*>(hdr)); break; } } return FALSE; }
// See also: // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/automat/htm/chap6_7zdz.asp HRESULT mHpWebClient::Invoke( DISPID dispIdMember, REFIID /*riid*/, LCID /*lcid */ , WORD /*wFlags */ , DISPPARAMS FAR* pDispParams , VARIANT FAR* /*pVarResult */ , EXCEPINFO FAR* /*pExcepInfo */ , unsigned int FAR* /*puArgErr */ ) { /* _______________ From ExDispid.h ---===============--- The constants passed through dispIdMember seem to be defined in ExDispId.h. However, in the MinGw distribution, only a few are defined, much less than in Microsofts Platform SDK. So, I am defininig those that I need here.... */ #define DISPID_BEFORENAVIGATE 100 // this is sent before navigation to give a chance to abort #define DISPID_COMMANDSTATECHANGE 105 #define DISPID_NAVIGATECOMPLETE2 252 // UIActivate new document #define DISPID_NAVIGATEERROR 271 // Fired to indicate the a binding error has occured #define DISPID_DOWNLOADCOMPLETE 104 #define DISPID_DOWNLOADBEGIN 106 #define DISPID_PROPERTYCHANGE 112 // sent when the PutProperty method is called #define DISPID_SETSECURELOCKICON 269 // sent to suggest the appropriate security icon to show //#define DISPID_PROGRESSCHANGE 108 // sent when download progress is updated switch (dispIdMember) { case DISPID_BEFORENAVIGATE : // this is sent before navigation to give a chance to abort ::MessageBox(0, "Before Navigate", 0, 0); return S_OK; break; // case DISPID_NAVIGATECOMPLETE : // in async, this is sent when we have enough to show // // ::MessageBox(0, "Download complete", 0, 0); // break; case DISPID_STATUSTEXTCHANGE : //case DISPID_QUIT : case DISPID_DOWNLOADCOMPLETE: return S_OK; case DISPID_COMMANDSTATECHANGE : return S_OK; break; case DISPID_DOWNLOADBEGIN : return S_OK; break; //case DISPID_NEWWINDOW : // sent when a new window should be created case DISPID_PROGRESSCHANGE : // sent when download progress is updated //case DISPID_WINDOWMOVE : // sent when main window has been moved //case DISPID_WINDOWRESIZE : // sent when main window has been sized //case DISPID_WINDOWACTIVATE : // sent when main window has been activated case DISPID_PROPERTYCHANGE: { // sent when the PutProperty method is called VARIANT a = pDispParams->rgvarg[0]; return S_OK; } case DISPID_TITLECHANGE : // sent when the document title changes //case DISPID_TITLEICONCHANGE : // sent when the top level window icon may have changed. //case DISPID_FRAMEBEFORENAVIGATE : //case DISPID_FRAMENAVIGATECOMPLETE : //case DISPID_FRAMENEWWINDOW : return S_OK; break; // DISPID_BEFORENAVIGATE2 replaces BeforeNavigate and FrameBeforeNavigate. These should not be // used anymore. case DISPID_BEFORENAVIGATE2: { // hyperlink clicked on TraceFunc("DWebBrowserEvents2::BeforeNavigate2 "); VARIANT vURL_p = pDispParams->rgvarg[5]; VARIANT vURL = *(vURL_p.pvarVal); VARIANT vCANCEL = pDispParams->rgvarg[0]; std::string type = VariantTypeAsString(vCANCEL); std::wstring ws_url = vURL.bstrVal; std::string url = ws2s(ws_url); Trace2("url=", url); if (BeforeNavigate(url, pDispParams)) { *(vCANCEL.pboolVal) = VARIANT_FALSE; } else { *(vCANCEL.pboolVal) = VARIANT_TRUE; VARIANT vDisp = pDispParams->rgvarg[6]; IDispatch* disp=vDisp.pdispVal; IWebBrowser2* webBrowser; disp->QueryInterface(IID_IWebBrowser2, reinterpret_cast<void**>(&webBrowser)); webBrowser->Stop(); } return S_OK; } break; case DISPID_NEWWINDOW2: return S_OK; case DISPID_NAVIGATECOMPLETE2: // UIActivate new document return S_OK; break; //case DISPID_ONQUIT : //case DISPID_ONVISIBLE : // sent when the window goes visible/hidden //case DISPID_ONTOOLBAR : // sent when the toolbar should be shown/hidden //case DISPID_ONMENUBAR : // sent when the menubar should be shown/hidden //case DISPID_ONSTATUSBAR : // sent when the statusbar should be shown/hidden //case DISPID_ONFULLSCREEN : // sent when kiosk mode should be on/off case DISPID_DOCUMENTCOMPLETE : // new document goes ReadyState_Complete //AddSink(); return S_OK; //case DISPID_ONTHEATERMODE : // sent when theater mode should be on/off //case DISPID_ONADDRESSBAR : // sent when the address bar should be shown/hidden //case DISPID_WINDOWSETRESIZABLE : // sent to set the style of the host window frame //case DISPID_WINDOWCLOSING : // sent before script window.close closes the window //case DISPID_WINDOWSETLEFT : // sent when the put_left method is called on the WebOC //case DISPID_WINDOWSETTOP : // sent when the put_top method is called on the WebOC //case DISPID_WINDOWSETWIDTH : // sent when the put_width method is called on the WebOC //case DISPID_WINDOWSETHEIGHT : // sent when the put_height method is called on the WebOC //case DISPID_CLIENTTOHOSTWINDOW : // sent during window.open to request conversion of dimensions //case DISPID_SETSECURELOCKICON : // sent to suggest the appropriate security icon to show //case DISPID_FILEDOWNLOAD : // Fired to indicate the File Download dialog is opening case DISPID_NAVIGATEERROR: { // Fired to indicate the a binding error has occured char buf[200]; VARIANT StatusCode=*((pDispParams->rgvarg[1]).pvarVal); sprintf(buf, "Navigate Error, code is: %d", static_cast<int>(StatusCode.lVal)); MessageBox(0, buf, 0, 0); //case DISPID_PRIVACYIMPACTEDSTATECHANGE : // Fired when the user's browsing experience is impacted return S_OK; } default: char buf[50]; sprintf(buf, "invoke, dispid: %d", static_cast<int>(dispIdMember)); if (TODO_bool) ::MessageBox(0, buf, 0, 0); return DISP_E_MEMBERNOTFOUND; } }