oleaut32: Assign to structs instead of using memcpy.
[wine/wine64.git] / dlls / hhctrl.ocx / webbrowser.c
blob4f17136ed0f6821f1b080cda3979658f226899a8
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 "hhctrl.h"
23 #define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
25 typedef struct IOleClientSiteImpl
27 const IOleClientSiteVtbl *lpVtbl;
28 const IOleInPlaceSiteVtbl *lpvtblOleInPlaceSite;
29 const IOleInPlaceFrameVtbl *lpvtblOleInPlaceFrame;
30 const IDocHostUIHandlerVtbl *lpvtblDocHostUIHandler;
32 /* IOleClientSiteImpl data */
33 IOleObject *pBrowserObject;
34 LONG ref;
36 /* IOleInPlaceFrame data */
37 HWND hwndWindow;
38 } IOleClientSiteImpl;
40 static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppvObj)
42 ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
43 *ppvObj = NULL;
45 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleClientSite))
47 *ppvObj = This;
49 else if (IsEqualIID(riid, &IID_IOleInPlaceSite))
51 *ppvObj = &(This->lpvtblOleInPlaceSite);
53 else if (IsEqualIID(riid, &IID_IDocHostUIHandler))
55 *ppvObj = &(This->lpvtblDocHostUIHandler);
57 else
58 return E_NOINTERFACE;
60 return S_OK;
63 static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface)
65 ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
66 return InterlockedIncrement(&This->ref);
69 static ULONG STDMETHODCALLTYPE Site_Release(IOleClientSite *iface)
71 ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
72 LONG refCount = InterlockedDecrement(&This->ref);
74 if (refCount)
75 return refCount;
77 heap_free(This);
78 return 0;
81 static HRESULT STDMETHODCALLTYPE Site_SaveObject(IOleClientSite *iface)
83 return E_NOTIMPL;
86 static HRESULT STDMETHODCALLTYPE Site_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
88 return E_NOTIMPL;
91 static HRESULT STDMETHODCALLTYPE Site_GetContainer(IOleClientSite *iface, LPOLECONTAINER *ppContainer)
93 *ppContainer = NULL;
95 return E_NOINTERFACE;
98 static HRESULT STDMETHODCALLTYPE Site_ShowObject(IOleClientSite *iface)
100 return NOERROR;
103 static HRESULT STDMETHODCALLTYPE Site_OnShowWindow(IOleClientSite *iface, BOOL fShow)
105 return E_NOTIMPL;
108 static HRESULT STDMETHODCALLTYPE Site_RequestNewObjectLayout(IOleClientSite *iface)
110 return E_NOTIMPL;
113 static const IOleClientSiteVtbl MyIOleClientSiteTable =
115 Site_QueryInterface,
116 Site_AddRef,
117 Site_Release,
118 Site_SaveObject,
119 Site_GetMoniker,
120 Site_GetContainer,
121 Site_ShowObject,
122 Site_OnShowWindow,
123 Site_RequestNewObjectLayout
126 static HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler *iface, REFIID riid, LPVOID *ppvObj)
128 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface);
129 return Site_QueryInterface((IOleClientSite *)This, riid, ppvObj);
132 static ULONG STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler *iface)
134 return 1;
137 static ULONG STDMETHODCALLTYPE UI_Release(IDocHostUIHandler * iface)
139 return 2;
142 static HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler *iface, DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved)
144 return S_OK;
147 static HRESULT STDMETHODCALLTYPE UI_GetHostInfo(IDocHostUIHandler *iface, DOCHOSTUIINFO *pInfo)
149 pInfo->cbSize = sizeof(DOCHOSTUIINFO);
150 pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
151 pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
153 return S_OK;
156 static HRESULT STDMETHODCALLTYPE UI_ShowUI(IDocHostUIHandler *iface, DWORD dwID, IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
158 return S_OK;
161 static HRESULT STDMETHODCALLTYPE UI_HideUI(IDocHostUIHandler *iface)
163 return S_OK;
166 static HRESULT STDMETHODCALLTYPE UI_UpdateUI(IDocHostUIHandler *iface)
168 return S_OK;
171 static HRESULT STDMETHODCALLTYPE UI_EnableModeless(IDocHostUIHandler *iface, BOOL fEnable)
173 return S_OK;
176 static HRESULT STDMETHODCALLTYPE UI_OnDocWindowActivate(IDocHostUIHandler *iface, BOOL fActivate)
178 return S_OK;
181 static HRESULT STDMETHODCALLTYPE UI_OnFrameWindowActivate(IDocHostUIHandler *iface, BOOL fActivate)
183 return S_OK;
186 static HRESULT STDMETHODCALLTYPE UI_ResizeBorder(IDocHostUIHandler *iface, LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
188 return S_OK;
191 static HRESULT STDMETHODCALLTYPE UI_TranslateAccelerator(IDocHostUIHandler *iface, LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID)
193 return S_FALSE;
196 static HRESULT STDMETHODCALLTYPE UI_GetOptionKeyPath(IDocHostUIHandler *iface, LPOLESTR *pchKey, DWORD dw)
198 return S_FALSE;
201 static HRESULT STDMETHODCALLTYPE UI_GetDropTarget(IDocHostUIHandler *iface, IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
203 return S_FALSE;
206 static HRESULT STDMETHODCALLTYPE UI_GetExternal(IDocHostUIHandler *iface, IDispatch **ppDispatch)
208 *ppDispatch = NULL;
209 return S_FALSE;
212 static HRESULT STDMETHODCALLTYPE UI_TranslateUrl(IDocHostUIHandler *iface, DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
214 *ppchURLOut = NULL;
215 return S_FALSE;
218 static HRESULT STDMETHODCALLTYPE UI_FilterDataObject(IDocHostUIHandler *iface, IDataObject *pDO, IDataObject **ppDORet)
220 *ppDORet = NULL;
221 return S_FALSE;
224 static const IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable =
226 UI_QueryInterface,
227 UI_AddRef,
228 UI_Release,
229 UI_ShowContextMenu,
230 UI_GetHostInfo,
231 UI_ShowUI,
232 UI_HideUI,
233 UI_UpdateUI,
234 UI_EnableModeless,
235 UI_OnDocWindowActivate,
236 UI_OnFrameWindowActivate,
237 UI_ResizeBorder,
238 UI_TranslateAccelerator,
239 UI_GetOptionKeyPath,
240 UI_GetDropTarget,
241 UI_GetExternal,
242 UI_TranslateUrl,
243 UI_FilterDataObject
246 static HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite *iface, REFIID riid, LPVOID *ppvObj)
248 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
249 return Site_QueryInterface((IOleClientSite *)This, riid, ppvObj);
252 static ULONG STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite *iface)
254 return 1;
257 static ULONG STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite *iface)
259 return 2;
262 static HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite *iface, HWND *lphwnd)
264 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
265 *lphwnd = This->hwndWindow;
267 return S_OK;
270 static HRESULT STDMETHODCALLTYPE InPlace_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
272 return E_NOTIMPL;
275 static HRESULT STDMETHODCALLTYPE InPlace_CanInPlaceActivate(IOleInPlaceSite *iface)
277 return S_OK;
280 static HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceActivate(IOleInPlaceSite *iface)
282 return S_OK;
285 static HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite *iface)
287 return S_OK;
290 static HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite *iface, LPOLEINPLACEFRAME *lplpFrame, LPOLEINPLACEUIWINDOW *lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
292 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
293 *lplpFrame = (LPOLEINPLACEFRAME)&This->lpvtblOleInPlaceFrame;
294 *lplpDoc = NULL;
296 lpFrameInfo->fMDIApp = FALSE;
297 lpFrameInfo->hwndFrame = This->hwndWindow;
298 lpFrameInfo->haccel = NULL;
299 lpFrameInfo->cAccelEntries = 0;
301 return S_OK;
304 static HRESULT STDMETHODCALLTYPE InPlace_Scroll(IOleInPlaceSite *iface, SIZE scrollExtent)
306 return E_NOTIMPL;
309 static HRESULT STDMETHODCALLTYPE InPlace_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
311 return S_OK;
314 static HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceDeactivate(IOleInPlaceSite *iface)
316 return S_OK;
319 static HRESULT STDMETHODCALLTYPE InPlace_DiscardUndoState(IOleInPlaceSite *iface)
321 return E_NOTIMPL;
324 static HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite *iface)
326 return E_NOTIMPL;
329 static HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
331 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
332 IOleInPlaceObject *inplace;
334 if (!IOleObject_QueryInterface(This->pBrowserObject, &IID_IOleInPlaceObject, (void **)&inplace))
335 IOleInPlaceObject_SetObjectRects(inplace, lprcPosRect, lprcPosRect);
337 return S_OK;
340 static const IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable =
342 InPlace_QueryInterface,
343 InPlace_AddRef,
344 InPlace_Release,
345 InPlace_GetWindow,
346 InPlace_ContextSensitiveHelp,
347 InPlace_CanInPlaceActivate,
348 InPlace_OnInPlaceActivate,
349 InPlace_OnUIActivate,
350 InPlace_GetWindowContext,
351 InPlace_Scroll,
352 InPlace_OnUIDeactivate,
353 InPlace_OnInPlaceDeactivate,
354 InPlace_DiscardUndoState,
355 InPlace_DeactivateAndUndo,
356 InPlace_OnPosRectChange
359 static HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, LPVOID *ppvObj)
361 return E_NOTIMPL;
364 static ULONG STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame *iface)
366 return 1;
369 static ULONG STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame *iface)
371 return 2;
374 static HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame *iface, HWND *lphwnd)
376 ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface);
377 *lphwnd = This->hwndWindow;
379 return S_OK;
382 static HRESULT STDMETHODCALLTYPE Frame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
384 return E_NOTIMPL;
387 static HRESULT STDMETHODCALLTYPE Frame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
389 return E_NOTIMPL;
392 static HRESULT STDMETHODCALLTYPE Frame_RequestBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
394 return E_NOTIMPL;
397 static HRESULT STDMETHODCALLTYPE Frame_SetBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
399 return E_NOTIMPL;
402 static HRESULT STDMETHODCALLTYPE Frame_SetActiveObject(IOleInPlaceFrame *iface, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
404 return S_OK;
407 static HRESULT STDMETHODCALLTYPE Frame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
409 return E_NOTIMPL;
412 static HRESULT STDMETHODCALLTYPE Frame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
414 return S_OK;
417 static HRESULT STDMETHODCALLTYPE Frame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
419 return E_NOTIMPL;
422 static HRESULT STDMETHODCALLTYPE Frame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
424 return S_OK;
427 static HRESULT STDMETHODCALLTYPE Frame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
429 return S_OK;
432 static HRESULT STDMETHODCALLTYPE Frame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
434 return E_NOTIMPL;
437 static const IOleInPlaceFrameVtbl MyIOleInPlaceFrameTable =
439 Frame_QueryInterface,
440 Frame_AddRef,
441 Frame_Release,
442 Frame_GetWindow,
443 Frame_ContextSensitiveHelp,
444 Frame_GetBorder,
445 Frame_RequestBorderSpace,
446 Frame_SetBorderSpace,
447 Frame_SetActiveObject,
448 Frame_InsertMenus,
449 Frame_SetMenu,
450 Frame_RemoveMenus,
451 Frame_SetStatusText,
452 Frame_EnableModeless,
453 Frame_TranslateAccelerator
456 static HRESULT STDMETHODCALLTYPE Storage_QueryInterface(IStorage *This, REFIID riid, LPVOID *ppvObj)
458 return E_NOTIMPL;
461 static ULONG STDMETHODCALLTYPE Storage_AddRef(IStorage *This)
463 return 1;
466 static ULONG STDMETHODCALLTYPE Storage_Release(IStorage *This)
468 return 2;
471 static HRESULT STDMETHODCALLTYPE Storage_CreateStream(IStorage *This, const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm)
473 return E_NOTIMPL;
476 static HRESULT STDMETHODCALLTYPE Storage_OpenStream(IStorage *This, const WCHAR * pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm)
478 return E_NOTIMPL;
481 static HRESULT STDMETHODCALLTYPE Storage_CreateStorage(IStorage *This, const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg)
483 return E_NOTIMPL;
486 static HRESULT STDMETHODCALLTYPE Storage_OpenStorage(IStorage *This, const WCHAR * pwcsName, IStorage * pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg)
488 return E_NOTIMPL;
491 static HRESULT STDMETHODCALLTYPE Storage_CopyTo(IStorage *This, DWORD ciidExclude, IID const *rgiidExclude, SNB snbExclude,IStorage *pstgDest)
493 return E_NOTIMPL;
496 static HRESULT STDMETHODCALLTYPE Storage_MoveElementTo(IStorage *This, const OLECHAR *pwcsName,IStorage * pstgDest, const OLECHAR *pwcsNewName, DWORD grfFlags)
498 return E_NOTIMPL;
501 static HRESULT STDMETHODCALLTYPE Storage_Commit(IStorage *This, DWORD grfCommitFlags)
503 return E_NOTIMPL;
506 static HRESULT STDMETHODCALLTYPE Storage_Revert(IStorage *This)
508 return E_NOTIMPL;
511 static HRESULT STDMETHODCALLTYPE Storage_EnumElements(IStorage *This, DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum)
513 return E_NOTIMPL;
516 static HRESULT STDMETHODCALLTYPE Storage_DestroyElement(IStorage *This, const OLECHAR *pwcsName)
518 return E_NOTIMPL;
521 static HRESULT STDMETHODCALLTYPE Storage_RenameElement(IStorage *This, const WCHAR *pwcsOldName, const WCHAR *pwcsNewName)
523 return E_NOTIMPL;
526 static HRESULT STDMETHODCALLTYPE Storage_SetElementTimes(IStorage *This, const WCHAR *pwcsName, FILETIME const *pctime, FILETIME const *patime, FILETIME const *pmtime)
528 return E_NOTIMPL;
531 static HRESULT STDMETHODCALLTYPE Storage_SetClass(IStorage *This, REFCLSID clsid)
533 return S_OK;
536 static HRESULT STDMETHODCALLTYPE Storage_SetStateBits(IStorage *This, DWORD grfStateBits, DWORD grfMask)
538 return E_NOTIMPL;
541 static HRESULT STDMETHODCALLTYPE Storage_Stat(IStorage *This, STATSTG *pstatstg, DWORD grfStatFlag)
543 return E_NOTIMPL;
546 static const IStorageVtbl MyIStorageTable =
548 Storage_QueryInterface,
549 Storage_AddRef,
550 Storage_Release,
551 Storage_CreateStream,
552 Storage_OpenStream,
553 Storage_CreateStorage,
554 Storage_OpenStorage,
555 Storage_CopyTo,
556 Storage_MoveElementTo,
557 Storage_Commit,
558 Storage_Revert,
559 Storage_EnumElements,
560 Storage_DestroyElement,
561 Storage_RenameElement,
562 Storage_SetElementTimes,
563 Storage_SetClass,
564 Storage_SetStateBits,
565 Storage_Stat
568 static IStorage MyIStorage = { &MyIStorageTable };
570 BOOL InitWebBrowser(HHInfo *info, HWND hwndParent)
572 IOleClientSiteImpl *iOleClientSiteImpl;
573 IOleInPlaceObject *inplace;
574 IOleObject *browserObject;
575 IWebBrowser2 *webBrowser2;
576 HRESULT hr;
577 RECT rc;
579 iOleClientSiteImpl = heap_alloc_zero(sizeof(IOleClientSiteImpl));
580 if (!iOleClientSiteImpl)
581 return FALSE;
583 iOleClientSiteImpl->ref = 1;
584 iOleClientSiteImpl->lpVtbl = &MyIOleClientSiteTable;
585 iOleClientSiteImpl->lpvtblOleInPlaceSite = &MyIOleInPlaceSiteTable;
586 iOleClientSiteImpl->lpvtblOleInPlaceFrame = &MyIOleInPlaceFrameTable;
587 iOleClientSiteImpl->hwndWindow = hwndParent;
588 iOleClientSiteImpl->lpvtblDocHostUIHandler = &MyIDocHostUIHandlerTable;
590 hr = OleCreate(&CLSID_WebBrowser, &IID_IOleObject, OLERENDER_DRAW, 0,
591 (IOleClientSite *)iOleClientSiteImpl, &MyIStorage,
592 (void **)&browserObject);
594 info->client_site = (IOleClientSite *)iOleClientSiteImpl;
595 info->wb_object = browserObject;
597 if (FAILED(hr)) goto error;
599 /* make the browser object accessible to the IOleClientSite implementation */
600 iOleClientSiteImpl->pBrowserObject = browserObject;
602 GetClientRect(hwndParent, &rc);
604 hr = OleSetContainedObject((struct IUnknown *)browserObject, TRUE);
605 if (FAILED(hr)) goto error;
607 hr = IOleObject_DoVerb(browserObject, OLEIVERB_SHOW, NULL,
608 (IOleClientSite *)iOleClientSiteImpl,
609 -1, hwndParent, &rc);
610 if (FAILED(hr)) goto error;
612 hr = IOleObject_QueryInterface(browserObject, &IID_IOleInPlaceObject, (void**)&inplace);
613 if (FAILED(hr)) goto error;
615 IOleInPlaceObject_SetObjectRects(inplace, &rc, &rc);
616 IOleInPlaceObject_Release(inplace);
618 hr = IOleObject_QueryInterface(browserObject, &IID_IWebBrowser2,
619 (void **)&webBrowser2);
620 if (SUCCEEDED(hr))
622 info->web_browser = webBrowser2;
623 return TRUE;
626 error:
627 ReleaseWebBrowser(info);
628 heap_free(iOleClientSiteImpl);
630 return FALSE;
633 void ReleaseWebBrowser(HHInfo *info)
635 HRESULT hres;
637 if (info->web_browser)
639 IWebBrowser2_Release(info->web_browser);
640 info->web_browser = NULL;
643 if (info->client_site)
645 IOleClientSite_Release(info->client_site);
646 info->client_site = NULL;
649 if(info->wb_object) {
650 IOleInPlaceSite *inplace;
652 hres = IOleObject_QueryInterface(info->wb_object, &IID_IOleInPlaceSite, (void**)&inplace);
653 if(SUCCEEDED(hres)) {
654 IOleInPlaceSite_OnInPlaceDeactivate(inplace);
655 IOleInPlaceSite_Release(inplace);
658 IOleObject_SetClientSite(info->wb_object, NULL);
660 IOleObject_Release(info->wb_object);
661 info->wb_object = NULL;
665 void ResizeWebBrowser(HHInfo *info, DWORD dwWidth, DWORD dwHeight)
667 if (!info->web_browser)
668 return;
670 IWebBrowser2_put_Width(info->web_browser, dwWidth);
671 IWebBrowser2_put_Height(info->web_browser, dwHeight);
674 void DoPageAction(HHInfo *info, DWORD dwAction)
676 IWebBrowser2 *pWebBrowser2 = info->web_browser;
678 if (!pWebBrowser2)
679 return;
681 switch (dwAction)
683 case WB_GOBACK:
684 IWebBrowser2_GoBack(pWebBrowser2);
685 break;
686 case WB_GOFORWARD:
687 IWebBrowser2_GoForward(pWebBrowser2);
688 break;
689 case WB_GOHOME:
690 IWebBrowser2_GoHome(pWebBrowser2);
691 break;
692 case WB_SEARCH:
693 IWebBrowser2_GoSearch(pWebBrowser2);
694 break;
695 case WB_REFRESH:
696 IWebBrowser2_Refresh(pWebBrowser2);
697 case WB_STOP:
698 IWebBrowser2_Stop(pWebBrowser2);