Hello. James Hawkins wrote:
Hi,
Changelog * Add the WebBrowser implementation. * Load the default Url in the HTML Pane.
...
+static HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler *iface, DWORD dwID, POINT __RPC_FAR *ppt, IUnknown __RPC_FAR *pcmdtReserved, IDispatch __RPC_FAR *pdispReserved)
You don't need to add __RPC_FAR here. Same in few other places.
+BOOL WB_EmbedBrowser(WBInfo *pWBInfo, HWND hwndParent) +{ + IOleClientSiteImpl *iOleClientSiteImpl; + IOleObject *browserObject; + IWebBrowser2 *webBrowser2; + HRESULT hr; + RECT rc; + + static const WCHAR hostNameW[] = {'H','o','s','t',' ','N','a','m','e',0}; + + iOleClientSiteImpl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(IOleClientSiteImpl)); + if (!iOleClientSiteImpl) + return FALSE; + + iOleClientSiteImpl->ref = 0; + iOleClientSiteImpl->lpVtbl = &MyIOleClientSiteTable; + iOleClientSiteImpl->lpvtblOleInPlaceSite = &MyIOleInPlaceSiteTable; + iOleClientSiteImpl->lpvtblOleInPlaceFrame = &MyIOleInPlaceFrameTable; + iOleClientSiteImpl->hwndWindow = hwndParent; + iOleClientSiteImpl->lpvtblDocHostUIHandler = &MyIDocHostUIHandlerTable; + + hr = OleCreate(&CLSID_WebBrowser, &IID_IOleObject, OLERENDER_DRAW, 0, + (IOleClientSite *)iOleClientSiteImpl, &MyIStorage, + (void **)&browserObject); + if (FAILED(hr)) goto error; + + /* make the browser object accessible to the IOleClientSite implementation */ + iOleClientSiteImpl->pBrowserObject = browserObject; + IOleObject_SetHostNames(browserObject, hostNameW, 0); + + GetClientRect(hwndParent, &rc); + + hr = OleSetContainedObject((struct IUnknown *)browserObject, TRUE); + if (FAILED(hr)) goto error; + + hr = OleSetContainedObject((struct IUnknown *)browserObject, TRUE); + if (FAILED(hr)) goto error;
Why do you call OleSetContainedObject twice?
+ + hr = IOleObject_DoVerb(browserObject, OLEIVERB_SHOW, NULL, + (IOleClientSite *)iOleClientSiteImpl, + -1, hwndParent, &rc); + if (FAILED(hr)) goto error; + + + hr = IOleObject_QueryInterface(browserObject, &IID_IWebBrowser2, + (void **)&webBrowser2); + if (SUCCEEDED(hr)) + { + IWebBrowser2_put_Left(webBrowser2, 0); + IWebBrowser2_put_Top(webBrowser2, 0); + IWebBrowser2_put_Width(webBrowser2, rc.right); + IWebBrowser2_put_Height(webBrowser2, rc.bottom); + + pWBInfo->pOleClientSite = (IOleClientSite *)iOleClientSiteImpl; + pWBInfo->pBrowserObject = browserObject; + pWBInfo->pWebBrowser2 = webBrowser2; + pWBInfo->hwndParent = hwndParent; + + return TRUE; + } + +error: + WB_UnEmbedBrowser(pWBInfo); + + if (webBrowser2) + IWebBrowser2_Release(webBrowser2); + + HeapFree(GetProcessHeap(), 0, iOleClientSiteImpl); + + return FALSE; +} +
...
+ +BOOL WB_Navigate(WBInfo *pWBInfo, LPCWSTR szUrl) +{ + IWebBrowser2 *pWebBrowser2 = pWBInfo->pWebBrowser2; + VARIANT myURL; + + if (!pWebBrowser2) + return FALSE; + + VariantInit(&myURL); + myURL.n1.n2.vt = VT_BSTR; + + myURL.n1.n2.n3.bstrVal = SysAllocString(szUrl);
It's better to use macros to use VARIANT type: V_VT(&myURL) = VT_BSTR; V_BSTR(&myURL) =SysAllocString(szUrl);
+ + if (!myURL.n1.n2.n3.bstrVal) + return FALSE; + + IWebBrowser2_Navigate2(pWebBrowser2, &myURL, 0, 0, 0, 0); + VariantClear(&myURL); + + return TRUE; +} +
Jacek