hhctrl: Load the default Url in the HTML Pane

Jacek Caban jack at itma.pwr.wroc.pl
Thu Sep 8 09:27:24 CDT 2005


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



More information about the wine-devel mailing list