hhctrl.ocx: Use ifaces instead of vtbl pointers in IOleClientSiteImpl.

Michael Stefaniuc mstefani at redhat.de
Mon Jan 17 03:36:47 CST 2011


---
 dlls/hhctrl.ocx/webbrowser.c |  111 +++++++++++++++++++++++------------------
 1 files changed, 62 insertions(+), 49 deletions(-)

diff --git a/dlls/hhctrl.ocx/webbrowser.c b/dlls/hhctrl.ocx/webbrowser.c
index 5033197..d90a1a5 100644
--- a/dlls/hhctrl.ocx/webbrowser.c
+++ b/dlls/hhctrl.ocx/webbrowser.c
@@ -24,14 +24,12 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
 
-#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
-
 typedef struct IOleClientSiteImpl
 {
-    const IOleClientSiteVtbl *lpVtbl;
-    const IOleInPlaceSiteVtbl *lpvtblOleInPlaceSite;
-    const IOleInPlaceFrameVtbl *lpvtblOleInPlaceFrame;
-    const IDocHostUIHandlerVtbl *lpvtblDocHostUIHandler;
+    IOleClientSite IOleClientSite_iface;
+    IOleInPlaceSite IOleInPlaceSite_iface;
+    IOleInPlaceFrame IOleInPlaceFrame_iface;
+    IDocHostUIHandler IDocHostUIHandler_iface;
 
     /* IOleClientSiteImpl data */
     IOleObject *pBrowserObject;
@@ -41,32 +39,32 @@ typedef struct IOleClientSiteImpl
     HWND hwndWindow;
 } IOleClientSiteImpl;
 
-#define CLIENTSITE(x)    ((IOleClientSite*)     &(x)->lpVtbl)
-#define DOCHOSTUI(x)     ((IDocHostUIHandler*)  &(x)->lpvtblDocHostUIHandler)
-#define INPLACESITE(x)   ((IOleInPlaceSite*)    &(x)->lpvtblOleInPlaceSite)
-#define INPLACEFRAME(x)  ((IOleInPlaceFrame*)   &(x)->lpvtblOleInPlaceFrame)
+static inline IOleClientSiteImpl *impl_from_IOleClientSite(IOleClientSite *iface)
+{
+    return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleClientSite_iface);
+}
 
 static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppvObj)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
+    IOleClientSiteImpl *This = impl_from_IOleClientSite(iface);
 
     *ppvObj = NULL;
 
     if (IsEqualIID(riid, &IID_IUnknown)) {
         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppvObj);
-        *ppvObj = CLIENTSITE(This);
+        *ppvObj = &This->IOleClientSite_iface;
     }else if(IsEqualIID(riid, &IID_IOleClientSite)) {
         TRACE("(%p)->(IID_IOleClientSite %p)\n", This, ppvObj);
-        *ppvObj = CLIENTSITE(This);
+        *ppvObj = &This->IOleClientSite_iface;
     }else if (IsEqualIID(riid, &IID_IOleInPlaceSite)) {
         TRACE("(%p)->(IID_IOleInPlaceSite %p)\n", This, ppvObj);
-        *ppvObj = &(This->lpvtblOleInPlaceSite);
+        *ppvObj = &This->IOleInPlaceSite_iface;
     }else if (IsEqualIID(riid, &IID_IOleInPlaceFrame)) {
         TRACE("(%p)->(IID_IOleInPlaceFrame %p)\n", This, ppvObj);
-        *ppvObj = &(This->lpvtblOleInPlaceSite);
+        *ppvObj = &This->IOleInPlaceSite_iface;
     }else if (IsEqualIID(riid, &IID_IDocHostUIHandler)) {
         TRACE("(%p)->(IID_IDocHostUIHandler %p)\n", This, ppvObj);
-        *ppvObj = &(This->lpvtblDocHostUIHandler);
+        *ppvObj = &This->IDocHostUIHandler_iface;
     }else {
         TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObj);
         return E_NOINTERFACE;
@@ -78,7 +76,7 @@ static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFI
 
 static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
+    IOleClientSiteImpl *This = impl_from_IOleClientSite(iface);
     LONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p) ref=%d\n", This, ref);
@@ -88,7 +86,7 @@ static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface)
 
 static ULONG STDMETHODCALLTYPE Site_Release(IOleClientSite *iface)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
+    IOleClientSiteImpl *This = impl_from_IOleClientSite(iface);
     LONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p) ref=%d\n", This, ref);
@@ -144,25 +142,30 @@ static const IOleClientSiteVtbl MyIOleClientSiteTable =
     Site_RequestNewObjectLayout
 };
 
+static inline IOleClientSiteImpl *impl_from_IDocHostUIHandler(IDocHostUIHandler *iface)
+{
+    return CONTAINING_RECORD(iface, IOleClientSiteImpl, IDocHostUIHandler_iface);
+}
+
 static HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler *iface, REFIID riid, LPVOID *ppvObj)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface);
+    IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface);
 
-    return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppvObj);
+    return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
 }
 
 static ULONG STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler *iface)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface);
+    IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface);
 
-    return IOleClientSite_AddRef(CLIENTSITE(This));
+    return IOleClientSite_AddRef(&This->IOleClientSite_iface);
 }
 
 static ULONG STDMETHODCALLTYPE UI_Release(IDocHostUIHandler * iface)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface);
+    IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface);
 
-    return IOleClientSite_Release(CLIENTSITE(This));
+    return IOleClientSite_Release(&This->IOleClientSite_iface);
 }
 
 static HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler *iface, DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved)
@@ -269,30 +272,35 @@ static const IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable =
     UI_FilterDataObject
 };
 
+static inline IOleClientSiteImpl *impl_from_IOleInPlaceSite(IOleInPlaceSite *iface)
+{
+    return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleInPlaceSite_iface);
+}
+
 static HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite *iface, REFIID riid, LPVOID *ppvObj)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
 
-    return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppvObj);
+    return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
 }
 
 static ULONG STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite *iface)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
 
-    return IOleClientSite_AddRef(CLIENTSITE(This));
+    return IOleClientSite_AddRef(&This->IOleClientSite_iface);
 }
 
 static ULONG STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite *iface)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
 
-    return IOleClientSite_Release(CLIENTSITE(This));
+    return IOleClientSite_Release(&This->IOleClientSite_iface);
 }
 
 static HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite *iface, HWND *lphwnd)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
     *lphwnd = This->hwndWindow;
 
     return S_OK;
@@ -320,10 +328,10 @@ static HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite *iface)
 
 static HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite *iface, LPOLEINPLACEFRAME *lplpFrame, LPOLEINPLACEUIWINDOW *lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
 
-    *lplpFrame = INPLACEFRAME(This);
-    IOleInPlaceFrame_AddRef(INPLACEFRAME(This));
+    *lplpFrame = &This->IOleInPlaceFrame_iface;
+    IOleInPlaceFrame_AddRef(&This->IOleInPlaceFrame_iface);
 
     *lplpDoc = NULL;
 
@@ -362,7 +370,7 @@ static HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite *ifac
 
 static HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
     IOleInPlaceObject *inplace;
 
     if (IOleObject_QueryInterface(This->pBrowserObject, &IID_IOleInPlaceObject,
@@ -394,30 +402,35 @@ static const IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable =
     InPlace_OnPosRectChange
 };
 
+static inline IOleClientSiteImpl *impl_from_IOleInPlaceFrame(IOleInPlaceFrame *iface)
+{
+    return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleInPlaceFrame_iface);
+}
+
 static HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, LPVOID *ppvObj)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface);
 
-    return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppvObj);
+    return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
 }
 
 static ULONG STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame *iface)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface);
 
-    return IOleClientSite_AddRef(CLIENTSITE(This));
+    return IOleClientSite_AddRef(&This->IOleClientSite_iface);
 }
 
 static ULONG STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame *iface)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface);
 
-    return IOleClientSite_Release(CLIENTSITE(This));
+    return IOleClientSite_Release(&This->IOleClientSite_iface);
 }
 
 static HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame *iface, HWND *lphwnd)
 {
-    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface);
+    IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface);
     *lphwnd = This->hwndWindow;
 
     return S_OK;
@@ -625,17 +638,17 @@ BOOL InitWebBrowser(HHInfo *info, HWND hwndParent)
         return FALSE;
 
     iOleClientSiteImpl->ref = 1;
-    iOleClientSiteImpl->lpVtbl = &MyIOleClientSiteTable;
-    iOleClientSiteImpl->lpvtblOleInPlaceSite = &MyIOleInPlaceSiteTable;
-    iOleClientSiteImpl->lpvtblOleInPlaceFrame = &MyIOleInPlaceFrameTable;
+    iOleClientSiteImpl->IOleClientSite_iface.lpVtbl = &MyIOleClientSiteTable;
+    iOleClientSiteImpl->IOleInPlaceSite_iface.lpVtbl = &MyIOleInPlaceSiteTable;
+    iOleClientSiteImpl->IOleInPlaceFrame_iface.lpVtbl = &MyIOleInPlaceFrameTable;
     iOleClientSiteImpl->hwndWindow = hwndParent;
-    iOleClientSiteImpl->lpvtblDocHostUIHandler = &MyIDocHostUIHandlerTable;
+    iOleClientSiteImpl->IDocHostUIHandler_iface.lpVtbl = &MyIDocHostUIHandlerTable;
 
     hr = OleCreate(&CLSID_WebBrowser, &IID_IOleObject, OLERENDER_DRAW, 0,
-                   (IOleClientSite *)iOleClientSiteImpl, &MyIStorage,
+                   &iOleClientSiteImpl->IOleClientSite_iface, &MyIStorage,
                    (void **)&browserObject);
 
-    info->client_site = (IOleClientSite *)iOleClientSiteImpl;
+    info->client_site = &iOleClientSiteImpl->IOleClientSite_iface;
     info->wb_object = browserObject;
 
     if (FAILED(hr)) goto error;
@@ -649,7 +662,7 @@ BOOL InitWebBrowser(HHInfo *info, HWND hwndParent)
     if (FAILED(hr)) goto error;
 
     hr = IOleObject_DoVerb(browserObject, OLEIVERB_SHOW, NULL,
-                           (IOleClientSite *)iOleClientSiteImpl,
+                           &iOleClientSiteImpl->IOleClientSite_iface,
                            -1, hwndParent, &rc);
     if (FAILED(hr)) goto error;
 
-- 
1.7.3.4



More information about the wine-patches mailing list