HRESULT CMObject::GetActiveObject(const CLSID clsid) { HRESULT hr; IDispatchPtr tmpobj; Release(); hr=tmpobj.GetActiveObject(clsid); if(SUCCEEDED(hr)) p=tmpobj.Detach(); return hr; }
HRESULT CMObject::CreateObject(const CLSID clsid) { HRESULT hr; IDispatchPtr tmpobj; Release(); hr=tmpobj.CreateInstance(clsid); if (SUCCEEDED(hr)) p=tmpobj.Detach(); return hr; }
HRESULT CMObject::GetActiveObject(LPCTSTR objName) { HRESULT hr; IDispatchPtr tmpobj; Release(); #ifdef _UNICODE hr=tmpobj.GetActiveObject((LPOLESTR)objName); #else hr=tmpobj.GetActiveObject(objName); #endif if(SUCCEEDED(hr)) p=tmpobj.Detach(); return hr; }
HRESULT CMObject::CreateObject(LPCTSTR objName) { HRESULT hr; IDispatchPtr tmpobj; Release(); #ifdef _UNICODE hr=tmpobj.CreateInstance( (LPOLESTR)objName); #else hr=tmpobj.CreateInstance((LPCSTR)objName); #endif if (SUCCEEDED(hr)) p=tmpobj.Detach(); return hr; }
HRESULT STDMETHODCALLTYPE BrowserEvents2::Invoke( /* [in] */ DISPID dispId, /* [in] */ REFIID riid, /* [in] */ LCID lcid, /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS *pDispParams, /* [out] */ VARIANT *pVarResult, /* [out] */ EXCEPINFO *pExcepInfo, /* [out] */ UINT *puArgErr) { // When returning a result, you must check whether pVarResult // is not NULL and initialize it using VariantInit(). If it's // NULL then it doesn't expect a result. if (riid != IID_NULL) return DISP_E_UNKNOWNINTERFACE; pExcepInfo = 0; puArgErr = 0; HRESULT hr; json_value* settings = GetApplicationSettings(); if (dispId == DISPID_NEWWINDOW3) { /* When calling window.open() you get an error "Class not registered". Before this error appears DWebBrowserEvents2::NewWindow3 event is dispatched, you need to create the popup window in this event and assign the dispatch interface of the new popup browser to the first parameter of NewWindow3. */ LOG_DEBUG << "BrowserEvents2::NewWindow3()"; if (pDispParams->cArgs != 5) { LOG_WARNING << "BrowserEvents2::NewWindow3() failed: " "Expected 5 arguments"; _ASSERT(false); return DISP_E_BADPARAMCOUNT; } // ppDisp _ASSERT(pDispParams->rgvarg[4].vt == (VT_DISPATCH | VT_BYREF)); // Cancel _ASSERT(pDispParams->rgvarg[3].vt == (VT_BOOL | VT_BYREF)); // dwFlags _ASSERT(pDispParams->rgvarg[2].vt == VT_I4); // bstrUrlContext _ASSERT(pDispParams->rgvarg[1].vt == VT_BSTR); // bstrUrl _ASSERT(pDispParams->rgvarg[0].vt == VT_BSTR); HWND popupHandle = CreatePopupWindow( browserWindow_->GetWindowHandle()); _ASSERT(popupHandle); BrowserWindow* browserWindow = GetBrowserWindow(popupHandle); if (!browserWindow) { LOG_WARNING << "BrowserEvents2::NewWindow3() failed: " "CreatePopupWindow() failed"; // Cancel parameter. Current navigation should be cancelled. *pDispParams->rgvarg[3].pboolVal = VARIANT_TRUE; return S_OK; } const IWebBrowser2Ptr webBrowser2 = browserWindow->GetWebBrowser2(); IDispatchPtr dispatch; hr = webBrowser2->get_Application(&dispatch); if (FAILED(hr) || !dispatch) { LOG_WARNING << "BrowserEvents2::NewWindow3() failed: " "webBrowser2->get_Application() failed"; return S_OK; } *pDispParams->rgvarg[4].ppdispVal = dispatch.Detach(); *pDispParams->rgvarg[3].pboolVal = VARIANT_FALSE; // Following events (DWebBrowserEvents2) will appear // after popup creation, they inform about "features" // passed to "window.open", such as width, height and others: // DISPID_ONTOOLBAR // DISPID_ONADDRESSBAR // DISPID_WINDOWSETRESIZABLE // DISPID_ONMENUBAR // DISPID_ONSTATUSBAR // DISPID_ONFULLSCREEN // DISPID_CLIENTTOHOSTWINDOW // DISPID_WINDOWSETWIDTH // DISPID_WINDOWSETHEIGHT // DISPID_WINDOWSETTOP // DISPID_WINDOWSETLEFT // DISPID_NAVIGATECOMPLETE2 return S_OK; } else if (dispId == DISPID_WINDOWSETWIDTH) { _ASSERT(pDispParams->cArgs == 1); _ASSERT(pDispParams->rgvarg[0].vt == VT_I4); // nWidth long width = pDispParams->rgvarg[0].lVal; // LOG_DEBUG << "BrowserEvents2::WindowSetWidth(): width = " // << width; browserWindow_->SetWidth(width); } else if (dispId == DISPID_WINDOWSETHEIGHT) { _ASSERT(pDispParams->cArgs == 1); _ASSERT(pDispParams->rgvarg[0].vt == VT_I4); // nHeight long height = pDispParams->rgvarg[0].lVal; // LOG_DEBUG << "BrowserEvents2::WindowSetHeight(): height = " // << height; browserWindow_->SetHeight(height); } else if (dispId == DISPID_WINDOWSETTOP) { _ASSERT(pDispParams->cArgs == 1); _ASSERT(pDispParams->rgvarg[0].vt == VT_I4); // nTop long top = pDispParams->rgvarg[0].lVal; // LOG_DEBUG << "BrowserEvents2::WindowSetTop(): top = " // << top; browserWindow_->SetTop(top); } else if (dispId == DISPID_WINDOWSETLEFT) { _ASSERT(pDispParams->cArgs == 1); _ASSERT(pDispParams->rgvarg[0].vt == VT_I4); // nLeft long left = pDispParams->rgvarg[0].lVal; // LOG_DEBUG << "BrowserEvents2::WindowSetLeft(): left = " // << left; browserWindow_->SetLeft(left); } else if (dispId == DISPID_TITLECHANGE) { if (browserWindow_->IsPopup() && browserWindow_->IsUsingMetaTitle()) { _ASSERT(pDispParams->cArgs == 1); _ASSERT(pDispParams->rgvarg[0].vt == VT_BSTR); // Text BSTR title = pDispParams->rgvarg[0].bstrVal; // LOG_DEBUG << "BrowserEvents2::TitleChange(): " // "setting popup title = " << WideToUtf8(title); browserWindow_->SetTitle(title); } } else if (dispId == DISPID_NAVIGATEERROR) { LOG_DEBUG << "BrowserEvents2::NavigateError()"; if (pDispParams->cArgs != 5) { LOG_WARNING << "BrowserEvents2::NavigateError() failed: " "Expected 5 arguments"; _ASSERT(false); return DISP_E_BADPARAMCOUNT; } // pDisp _ASSERT(pDispParams->rgvarg[4].vt == VT_DISPATCH); // URL _ASSERT(pDispParams->rgvarg[3].vt == (VT_VARIANT | VT_BYREF)); _ASSERT(pDispParams->rgvarg[3].pvarVal->vt == VT_BSTR); // TargetFrameName _ASSERT(pDispParams->rgvarg[2].vt == (VT_VARIANT | VT_BYREF)); _ASSERT(pDispParams->rgvarg[2].pvarVal->vt == VT_BSTR); // StatusCode _ASSERT(pDispParams->rgvarg[1].vt == (VT_VARIANT | VT_BYREF)); _ASSERT(pDispParams->rgvarg[1].pvarVal->vt == VT_I4); // Cancel _ASSERT(pDispParams->rgvarg[0].vt == (VT_BOOL | VT_BYREF)); const wchar_t* navigateUrl = pDispParams->rgvarg[3].pvarVal->bstrVal; int statusCode = pDispParams->rgvarg[1].pvarVal->lVal; if (browserWindow_->DisplayErrorPage(navigateUrl, statusCode)) { *pDispParams->rgvarg[0].pboolVal = VARIANT_TRUE; return S_OK; } else { *pDispParams->rgvarg[0].pboolVal = VARIANT_FALSE; return S_OK; } } else if (dispId == DISPID_WINDOWCLOSING) { // Seems like this event is never being called, it should be // called when executing "window.close()", but it's not. // Use WM_PARENTNOTIFY instead to be notified when window is closing. LOG_DEBUG << "BrowserEvents2::WindowClosing()"; return S_OK; /* if (pDispParams->cArgs != 2) { LOG_WARNING << "BrowserEvents2::WindowClosing() failed: " "Expected 2 arguments"; _ASSERT(false); return DISP_E_BADPARAMCOUNT; } // bIsChildWindow _ASSERT(pDispParams->rgvarg[1].vt == VT_BOOL); // Cancel _ASSERT(pDispParams->rgvarg[0].vt == (VT_BOOL | VT_BYREF)); // VARIANT_FALSE - window is allowed to close.. *pDispParams->rgvarg[0].pboolVal = VARIANT_FALSE; return S_OK; */ } return S_OK; }