gdi32: Revert 1440eb5a35dc95dea1836d9035b51e2b15d83703 and add the test showing that...
[wine/hacks.git] / dlls / hhctrl.ocx / webbrowser.c
blob20572de8d3ef31e43452b2baf80e849569f29d8e
1 /*
2 * WebBrowser Implementation
4 * Copyright 2005 James Hawkins
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include <stdarg.h>
23 #define COBJMACROS
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "winnls.h"
29 #include "ole2.h"
31 #include "webbrowser.h"
33 #define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
35 typedef struct IOleClientSiteImpl
37 const IOleClientSiteVtbl *lpVtbl;
38 const IOleInPlaceSiteVtbl *lpvtblOleInPlaceSite;
39 const IOleInPlaceFrameVtbl *lpvtblOleInPlaceFrame;
40 const IDocHostUIHandlerVtbl *lpvtblDocHostUIHandler;
42 /* IOleClientSiteImpl data */
43 IOleObject *pBrowserObject;
44 LONG ref;
46 /* IOleInPlaceFrame data */
47 HWND hwndWindow;
48 } IOleClientSiteImpl;
50 static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppvObj)
52 ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
53 *ppvObj = NULL;
55 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleClientSite))
57 *ppvObj = This;
59 else if (IsEqualIID(riid, &IID_IOleInPlaceSite))
61 *ppvObj = &(This->lpvtblOleInPlaceSite);
63 else if (IsEqualIID(riid, &IID_IDocHostUIHandler))
65 *ppvObj = &(This->lpvtblDocHostUIHandler);
67 else
68 return E_NOINTERFACE;
70 return S_OK;
73 static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface)
75 ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
76 return InterlockedIncrement(&This->ref);
79 static ULONG STDMETHODCALLTYPE Site_Release(IOleClientSite *iface)
81 ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
82 LONG refCount = InterlockedDecrement(&This->ref);
84 if (refCount)
85 return refCount;
87 HeapFree(GetProcessHeap(), 0, This);
88 return 0;
91 static HRESULT STDMETHODCALLTYPE Site_SaveObject(IOleClientSite *iface)
93 return E_NOTIMPL;
96 static HRESULT STDMETHODCALLTYPE Site_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
98 return E_NOTIMPL;
101 static HRESULT STDMETHODCALLTYPE Site_GetContainer(IOleClientSite *iface, LPOLECONTAINER *ppContainer)
103 *ppContainer = NULL;
105 return E_NOINTERFACE;
108 static HRESULT STDMETHODCALLTYPE Site_ShowObject(IOleClientSite *iface)
110 return NOERROR;
113 static HRESULT STDMETHODCALLTYPE Site_OnShowWindow(IOleClientSite *iface, BOOL fShow)
115 return E_NOTIMPL;
118 static HRESULT STDMETHODCALLTYPE Site_RequestNewObjectLayout(IOleClientSite *iface)
120 return E_NOTIMPL;
123 static const IOleClientSiteVtbl MyIOleClientSiteTable =
125 Site_QueryInterface,
126 Site_AddRef,
127 Site_Release,
128 Site_SaveObject,
129 Site_GetMoniker,
130 Site_GetContainer,
131 Site_ShowObject,
132 Site_OnShowWindow,
133 Site_RequestNewObjectLayout
136 static HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler *iface, REFIID riid, LPVOID *ppvObj)
138 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface);
139 return Site_QueryInterface((IOleClientSite *)This, riid, ppvObj);
142 static ULONG STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler *iface)
144 return 1;
147 static ULONG STDMETHODCALLTYPE UI_Release(IDocHostUIHandler * iface)
149 return 2;
152 static HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler *iface, DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved)
154 return S_OK;
157 static HRESULT STDMETHODCALLTYPE UI_GetHostInfo(IDocHostUIHandler *iface, DOCHOSTUIINFO *pInfo)
159 pInfo->cbSize = sizeof(DOCHOSTUIINFO);
160 pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
161 pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
163 return S_OK;
166 static HRESULT STDMETHODCALLTYPE UI_ShowUI(IDocHostUIHandler *iface, DWORD dwID, IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
168 return S_OK;
171 static HRESULT STDMETHODCALLTYPE UI_HideUI(IDocHostUIHandler *iface)
173 return S_OK;
176 static HRESULT STDMETHODCALLTYPE UI_UpdateUI(IDocHostUIHandler *iface)
178 return S_OK;
181 static HRESULT STDMETHODCALLTYPE UI_EnableModeless(IDocHostUIHandler *iface, BOOL fEnable)
183 return S_OK;
186 static HRESULT STDMETHODCALLTYPE UI_OnDocWindowActivate(IDocHostUIHandler *iface, BOOL fActivate)
188 return S_OK;
191 static HRESULT STDMETHODCALLTYPE UI_OnFrameWindowActivate(IDocHostUIHandler *iface, BOOL fActivate)
193 return S_OK;
196 static HRESULT STDMETHODCALLTYPE UI_ResizeBorder(IDocHostUIHandler *iface, LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
198 return S_OK;
201 static HRESULT STDMETHODCALLTYPE UI_TranslateAccelerator(IDocHostUIHandler *iface, LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID)
203 return S_FALSE;
206 static HRESULT STDMETHODCALLTYPE UI_GetOptionKeyPath(IDocHostUIHandler *iface, LPOLESTR *pchKey, DWORD dw)
208 return S_FALSE;
211 static HRESULT STDMETHODCALLTYPE UI_GetDropTarget(IDocHostUIHandler *iface, IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
213 return S_FALSE;
216 static HRESULT STDMETHODCALLTYPE UI_GetExternal(IDocHostUIHandler *iface, IDispatch **ppDispatch)
218 *ppDispatch = NULL;
219 return S_FALSE;
222 static HRESULT STDMETHODCALLTYPE UI_TranslateUrl(IDocHostUIHandler *iface, DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
224 *ppchURLOut = NULL;
225 return S_FALSE;
228 static HRESULT STDMETHODCALLTYPE UI_FilterDataObject(IDocHostUIHandler *iface, IDataObject *pDO, IDataObject **ppDORet)
230 *ppDORet = NULL;
231 return S_FALSE;
234 static const IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable =
236 UI_QueryInterface,
237 UI_AddRef,
238 UI_Release,
239 UI_ShowContextMenu,
240 UI_GetHostInfo,
241 UI_ShowUI,
242 UI_HideUI,
243 UI_UpdateUI,
244 UI_EnableModeless,
245 UI_OnDocWindowActivate,
246 UI_OnFrameWindowActivate,
247 UI_ResizeBorder,
248 UI_TranslateAccelerator,
249 UI_GetOptionKeyPath,
250 UI_GetDropTarget,
251 UI_GetExternal,
252 UI_TranslateUrl,
253 UI_FilterDataObject
256 static HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite *iface, REFIID riid, LPVOID *ppvObj)
258 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
259 return Site_QueryInterface((IOleClientSite *)This, riid, ppvObj);
262 static ULONG STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite *iface)
264 return 1;
267 static ULONG STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite *iface)
269 return 2;
272 static HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite *iface, HWND *lphwnd)
274 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
275 *lphwnd = This->hwndWindow;
277 return S_OK;
280 static HRESULT STDMETHODCALLTYPE InPlace_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
282 return E_NOTIMPL;
285 static HRESULT STDMETHODCALLTYPE InPlace_CanInPlaceActivate(IOleInPlaceSite *iface)
287 return S_OK;
290 static HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceActivate(IOleInPlaceSite *iface)
292 return S_OK;
295 static HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite *iface)
297 return S_OK;
300 static HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite *iface, LPOLEINPLACEFRAME *lplpFrame, LPOLEINPLACEUIWINDOW *lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
302 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
303 *lplpFrame = (LPOLEINPLACEFRAME)&This->lpvtblOleInPlaceFrame;
304 *lplpDoc = NULL;
306 lpFrameInfo->fMDIApp = FALSE;
307 lpFrameInfo->hwndFrame = This->hwndWindow;
308 lpFrameInfo->haccel = NULL;
309 lpFrameInfo->cAccelEntries = 0;
311 return S_OK;
314 static HRESULT STDMETHODCALLTYPE InPlace_Scroll(IOleInPlaceSite *iface, SIZE scrollExtent)
316 return E_NOTIMPL;
319 static HRESULT STDMETHODCALLTYPE InPlace_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
321 return S_OK;
324 static HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceDeactivate(IOleInPlaceSite *iface)
326 return S_OK;
329 static HRESULT STDMETHODCALLTYPE InPlace_DiscardUndoState(IOleInPlaceSite *iface)
331 return E_NOTIMPL;
334 static HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite *iface)
336 return E_NOTIMPL;
339 static HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
341 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
342 IOleInPlaceObject *inplace;
344 if (!IOleObject_QueryInterface(This->pBrowserObject, &IID_IOleInPlaceObject, (void **)&inplace))
345 IOleInPlaceObject_SetObjectRects(inplace, lprcPosRect, lprcPosRect);
347 return S_OK;
350 static const IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable =
352 InPlace_QueryInterface,
353 InPlace_AddRef,
354 InPlace_Release,
355 InPlace_GetWindow,
356 InPlace_ContextSensitiveHelp,
357 InPlace_CanInPlaceActivate,
358 InPlace_OnInPlaceActivate,
359 InPlace_OnUIActivate,
360 InPlace_GetWindowContext,
361 InPlace_Scroll,
362 InPlace_OnUIDeactivate,
363 InPlace_OnInPlaceDeactivate,
364 InPlace_DiscardUndoState,
365 InPlace_DeactivateAndUndo,
366 InPlace_OnPosRectChange
369 static HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, LPVOID *ppvObj)
371 return E_NOTIMPL;
374 static ULONG STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame *iface)
376 return 1;
379 static ULONG STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame *iface)
381 return 2;
384 static HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame *iface, HWND *lphwnd)
386 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface);
387 *lphwnd = This->hwndWindow;
389 return S_OK;
392 static HRESULT STDMETHODCALLTYPE Frame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
394 return E_NOTIMPL;
397 static HRESULT STDMETHODCALLTYPE Frame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
399 return E_NOTIMPL;
402 static HRESULT STDMETHODCALLTYPE Frame_RequestBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
404 return E_NOTIMPL;
407 static HRESULT STDMETHODCALLTYPE Frame_SetBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
409 return E_NOTIMPL;
412 static HRESULT STDMETHODCALLTYPE Frame_SetActiveObject(IOleInPlaceFrame *iface, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
414 return S_OK;
417 static HRESULT STDMETHODCALLTYPE Frame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
419 return E_NOTIMPL;
422 static HRESULT STDMETHODCALLTYPE Frame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
424 return S_OK;
427 static HRESULT STDMETHODCALLTYPE Frame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
429 return E_NOTIMPL;
432 static HRESULT STDMETHODCALLTYPE Frame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
434 return S_OK;
437 static HRESULT STDMETHODCALLTYPE Frame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
439 return S_OK;
442 static HRESULT STDMETHODCALLTYPE Frame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
444 return E_NOTIMPL;
447 static const IOleInPlaceFrameVtbl MyIOleInPlaceFrameTable =
449 Frame_QueryInterface,
450 Frame_AddRef,
451 Frame_Release,
452 Frame_GetWindow,
453 Frame_ContextSensitiveHelp,
454 Frame_GetBorder,
455 Frame_RequestBorderSpace,
456 Frame_SetBorderSpace,
457 Frame_SetActiveObject,
458 Frame_InsertMenus,
459 Frame_SetMenu,
460 Frame_RemoveMenus,
461 Frame_SetStatusText,
462 Frame_EnableModeless,
463 Frame_TranslateAccelerator
466 static HRESULT STDMETHODCALLTYPE Storage_QueryInterface(IStorage *This, REFIID riid, LPVOID *ppvObj)
468 return E_NOTIMPL;
471 static ULONG STDMETHODCALLTYPE Storage_AddRef(IStorage *This)
473 return 1;
476 static ULONG STDMETHODCALLTYPE Storage_Release(IStorage *This)
478 return 2;
481 static HRESULT STDMETHODCALLTYPE Storage_CreateStream(IStorage *This, const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm)
483 return E_NOTIMPL;
486 static HRESULT STDMETHODCALLTYPE Storage_OpenStream(IStorage *This, const WCHAR * pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm)
488 return E_NOTIMPL;
491 static HRESULT STDMETHODCALLTYPE Storage_CreateStorage(IStorage *This, const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg)
493 return E_NOTIMPL;
496 static HRESULT STDMETHODCALLTYPE Storage_OpenStorage(IStorage *This, const WCHAR * pwcsName, IStorage * pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg)
498 return E_NOTIMPL;
501 static HRESULT STDMETHODCALLTYPE Storage_CopyTo(IStorage *This, DWORD ciidExclude, IID const *rgiidExclude, SNB snbExclude,IStorage *pstgDest)
503 return E_NOTIMPL;
506 static HRESULT STDMETHODCALLTYPE Storage_MoveElementTo(IStorage *This, const OLECHAR *pwcsName,IStorage * pstgDest, const OLECHAR *pwcsNewName, DWORD grfFlags)
508 return E_NOTIMPL;
511 static HRESULT STDMETHODCALLTYPE Storage_Commit(IStorage *This, DWORD grfCommitFlags)
513 return E_NOTIMPL;
516 static HRESULT STDMETHODCALLTYPE Storage_Revert(IStorage *This)
518 return E_NOTIMPL;
521 static HRESULT STDMETHODCALLTYPE Storage_EnumElements(IStorage *This, DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum)
523 return E_NOTIMPL;
526 static HRESULT STDMETHODCALLTYPE Storage_DestroyElement(IStorage *This, const OLECHAR *pwcsName)
528 return E_NOTIMPL;
531 static HRESULT STDMETHODCALLTYPE Storage_RenameElement(IStorage *This, const WCHAR *pwcsOldName, const WCHAR *pwcsNewName)
533 return E_NOTIMPL;
536 static HRESULT STDMETHODCALLTYPE Storage_SetElementTimes(IStorage *This, const WCHAR *pwcsName, FILETIME const *pctime, FILETIME const *patime, FILETIME const *pmtime)
538 return E_NOTIMPL;
541 static HRESULT STDMETHODCALLTYPE Storage_SetClass(IStorage *This, REFCLSID clsid)
543 return S_OK;
546 static HRESULT STDMETHODCALLTYPE Storage_SetStateBits(IStorage *This, DWORD grfStateBits, DWORD grfMask)
548 return E_NOTIMPL;
551 static HRESULT STDMETHODCALLTYPE Storage_Stat(IStorage *This, STATSTG *pstatstg, DWORD grfStatFlag)
553 return E_NOTIMPL;
556 static const IStorageVtbl MyIStorageTable =
558 Storage_QueryInterface,
559 Storage_AddRef,
560 Storage_Release,
561 Storage_CreateStream,
562 Storage_OpenStream,
563 Storage_CreateStorage,
564 Storage_OpenStorage,
565 Storage_CopyTo,
566 Storage_MoveElementTo,
567 Storage_Commit,
568 Storage_Revert,
569 Storage_EnumElements,
570 Storage_DestroyElement,
571 Storage_RenameElement,
572 Storage_SetElementTimes,
573 Storage_SetClass,
574 Storage_SetStateBits,
575 Storage_Stat
578 static IStorage MyIStorage = { &MyIStorageTable };
580 BOOL WB_EmbedBrowser(WBInfo *pWBInfo, HWND hwndParent)
582 IOleClientSiteImpl *iOleClientSiteImpl;
583 IOleInPlaceObject *inplace;
584 IOleObject *browserObject;
585 IWebBrowser2 *webBrowser2;
586 HRESULT hr;
587 RECT rc;
589 /* clear out struct to keep from accessing invalid ptrs */
590 ZeroMemory(pWBInfo, sizeof(WBInfo));
592 iOleClientSiteImpl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
593 sizeof(IOleClientSiteImpl));
594 if (!iOleClientSiteImpl)
595 return FALSE;
597 iOleClientSiteImpl->ref = 0;
598 iOleClientSiteImpl->lpVtbl = &MyIOleClientSiteTable;
599 iOleClientSiteImpl->lpvtblOleInPlaceSite = &MyIOleInPlaceSiteTable;
600 iOleClientSiteImpl->lpvtblOleInPlaceFrame = &MyIOleInPlaceFrameTable;
601 iOleClientSiteImpl->hwndWindow = hwndParent;
602 iOleClientSiteImpl->lpvtblDocHostUIHandler = &MyIDocHostUIHandlerTable;
604 hr = OleCreate(&CLSID_WebBrowser, &IID_IOleObject, OLERENDER_DRAW, 0,
605 (IOleClientSite *)iOleClientSiteImpl, &MyIStorage,
606 (void **)&browserObject);
608 pWBInfo->pOleClientSite = (IOleClientSite *)iOleClientSiteImpl;
609 pWBInfo->pBrowserObject = browserObject;
611 if (FAILED(hr)) goto error;
613 /* make the browser object accessible to the IOleClientSite implementation */
614 iOleClientSiteImpl->pBrowserObject = browserObject;
616 GetClientRect(hwndParent, &rc);
618 hr = OleSetContainedObject((struct IUnknown *)browserObject, TRUE);
619 if (FAILED(hr)) goto error;
621 hr = IOleObject_DoVerb(browserObject, OLEIVERB_SHOW, NULL,
622 (IOleClientSite *)iOleClientSiteImpl,
623 -1, hwndParent, &rc);
624 if (FAILED(hr)) goto error;
626 hr = IOleObject_QueryInterface(browserObject, &IID_IOleInPlaceObject, (void**)&inplace);
627 if (FAILED(hr)) goto error;
629 IOleInPlaceObject_SetObjectRects(inplace, &rc, &rc);
630 IOleInPlaceObject_Release(inplace);
632 hr = IOleObject_QueryInterface(browserObject, &IID_IWebBrowser2,
633 (void **)&webBrowser2);
634 if (SUCCEEDED(hr))
636 pWBInfo->pWebBrowser2 = webBrowser2;
637 pWBInfo->hwndParent = hwndParent;
639 return TRUE;
642 error:
643 WB_UnEmbedBrowser(pWBInfo);
644 HeapFree(GetProcessHeap(), 0, iOleClientSiteImpl);
646 return FALSE;
649 void WB_UnEmbedBrowser(WBInfo *pWBInfo)
651 if (pWBInfo->pBrowserObject)
653 IOleObject_Close(pWBInfo->pBrowserObject, OLECLOSE_NOSAVE);
654 IOleObject_Release(pWBInfo->pBrowserObject);
655 pWBInfo->pBrowserObject = NULL;
658 if (pWBInfo->pWebBrowser2)
660 IWebBrowser2_Release(pWBInfo->pWebBrowser2);
661 pWBInfo->pWebBrowser2 = NULL;
664 if (pWBInfo->pOleClientSite)
666 IOleClientSite_Release(pWBInfo->pOleClientSite);
667 pWBInfo->pOleClientSite = NULL;
671 void WB_ResizeBrowser(WBInfo *pWBInfo, DWORD dwWidth, DWORD dwHeight)
673 IWebBrowser2 *pWebBrowser2 = pWBInfo->pWebBrowser2;
675 if (!pWebBrowser2)
676 return;
678 IWebBrowser2_put_Width(pWebBrowser2, dwWidth);
679 IWebBrowser2_put_Height(pWebBrowser2, dwHeight);
682 void WB_DoPageAction(WBInfo *pWBInfo, DWORD dwAction)
684 IWebBrowser2 *pWebBrowser2 = pWBInfo->pWebBrowser2;
686 if (!pWebBrowser2)
687 return;
689 switch (dwAction)
691 case WB_GOBACK:
692 IWebBrowser2_GoBack(pWebBrowser2);
693 break;
694 case WB_GOFORWARD:
695 IWebBrowser2_GoForward(pWebBrowser2);
696 break;
697 case WB_GOHOME:
698 IWebBrowser2_GoHome(pWebBrowser2);
699 break;
700 case WB_SEARCH:
701 IWebBrowser2_GoSearch(pWebBrowser2);
702 break;
703 case WB_REFRESH:
704 IWebBrowser2_Refresh(pWebBrowser2);
705 case WB_STOP:
706 IWebBrowser2_Stop(pWebBrowser2);