SHDOCVW: Make IOleControl and IOleInPlaceObject interface heap based

Jacek Caban jack at itma.pwr.wroc.pl
Tue Sep 6 13:59:10 CDT 2005


Changelog:
    Make IOleControl and IOleInPlaceObject interface heap based
-------------- next part --------------
Index: dlls/shdocvw/oleobject.c
===================================================================
RCS file: /home/wine/wine/dlls/shdocvw/oleobject.c,v
retrieving revision 1.15
diff -u -p -r1.15 oleobject.c
--- dlls/shdocvw/oleobject.c	6 Sep 2005 11:41:15 -0000	1.15
+++ dlls/shdocvw/oleobject.c	6 Sep 2005 18:53:16 -0000
@@ -260,32 +260,33 @@ static const IOleObjectVtbl OleObjectVtb
  * Implement the IOleInPlaceObject interface
  */
 
-static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,
-                                            REFIID riid, LPVOID *ppobj)
-{
-    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+#define INPLACEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceObject, iface)
 
-    if (ppobj == NULL) return E_POINTER;
-    
-    return E_NOINTERFACE;
+static HRESULT WINAPI OleInPlaceObject_QueryInterface(IOleInPlaceObject *iface,
+        REFIID riid, LPVOID *ppobj)
+{
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+    return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
 }
 
-static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)
+static ULONG WINAPI OleInPlaceObject_AddRef(IOleInPlaceObject *iface)
 {
-    SHDOCVW_LockModule();
-
-    return 2; /* non-heap based object */
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+    return IWebBrowser_AddRef(WEBBROWSER(This));
 }
 
-static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)
+static ULONG WINAPI OleInPlaceObject_Release(IOleInPlaceObject *iface)
 {
-    SHDOCVW_UnlockModule();
-
-    return 1; /* non-heap based object */
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+    return IWebBrowser_Release(WEBBROWSER(This));
 }
 
-static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)
+static HRESULT WINAPI OleInPlaceObject_GetWindow(IOleInPlaceObject *iface, HWND* phwnd)
 {
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+
+    FIXME("(%p)->(%p)\n", This, phwnd);
+
 #if 0
     /* Create a fake window to fool MFC into believing that we actually
      * have an implemented browser control.  Avoids the assertion.
@@ -300,132 +301,130 @@ static HRESULT WINAPI WBOIPO_GetWindow(L
     TRACE ("Returning hwnd = %d\n", hwnd);
 #endif
 
-    FIXME("stub HWND* = %p\n", phwnd);
     return S_OK;
 }
 
-static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
-                                                  BOOL fEnterMode)
+static HRESULT WINAPI OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject *iface,
+        BOOL fEnterMode)
 {
-    FIXME("stub fEnterMode = %d\n", fEnterMode);
-    return S_OK;
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+    FIXME("(%p)->(%x)\n", This, fEnterMode);
+    return E_NOTIMPL;
 }
 
-static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
+static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject *iface)
 {
-    FIXME("stub \n");
-    return S_OK;
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
 }
 
-static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
+static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObject *iface)
 {
-    FIXME("stub \n");
-    return S_OK;
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
 }
 
-static HRESULT WINAPI WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface,
-                                            LPCRECT lprcPosRect, LPCRECT lprcClipRect)
+static HRESULT WINAPI OleInPlaceObject_SetObjectRects(IOleInPlaceObject *iface,
+        LPCRECT lprcPosRect, LPCRECT lprcClipRect)
 {
-    FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect, lprcClipRect);
-    return S_OK;
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+    FIXME("(%p)->(%p %p)\n", This, lprcPosRect, lprcClipRect);
+    return E_NOTIMPL;
 }
 
-static HRESULT WINAPI WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface)
+static HRESULT WINAPI OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject *iface)
 {
-    FIXME("stub \n");
-    return S_OK;
+    WebBrowser *This = INPLACEOBJ_THIS(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
 }
 
-/**********************************************************************
- * IOleInPlaceObject virtual function table for IE Web Browser component
- */
+#undef INPLACEOBJ_THIS
 
-static const IOleInPlaceObjectVtbl WBOIPO_Vtbl =
+static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl =
 {
-    WBOIPO_QueryInterface,
-    WBOIPO_AddRef,
-    WBOIPO_Release,
-    WBOIPO_GetWindow,
-    WBOIPO_ContextSensitiveHelp,
-    WBOIPO_InPlaceDeactivate,
-    WBOIPO_UIDeactivate,
-    WBOIPO_SetObjectRects,
-    WBOIPO_ReactivateAndUndo
+    OleInPlaceObject_QueryInterface,
+    OleInPlaceObject_AddRef,
+    OleInPlaceObject_Release,
+    OleInPlaceObject_GetWindow,
+    OleInPlaceObject_ContextSensitiveHelp,
+    OleInPlaceObject_InPlaceDeactivate,
+    OleInPlaceObject_UIDeactivate,
+    OleInPlaceObject_SetObjectRects,
+    OleInPlaceObject_ReactivateAndUndo
 };
 
-IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = {&WBOIPO_Vtbl};
-
-
 /**********************************************************************
  * Implement the IOleControl interface
  */
 
-static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,
-                                          REFIID riid, LPVOID *ppobj)
-{
-    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+#define CONTROL_THIS(iface) DEFINE_THIS(WebBrowser, OleControl, iface)
 
-    if (ppobj == NULL) return E_POINTER;
-    
-    return E_NOINTERFACE;
+static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface,
+        REFIID riid, LPVOID *ppobj)
+{
+    WebBrowser *This = CONTROL_THIS(iface);
+    return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj);
 }
 
-static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)
+static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
 {
-    SHDOCVW_LockModule();
-
-    return 2; /* non-heap based object */
+    WebBrowser *This = CONTROL_THIS(iface);
+    return IWebBrowser_AddRef(WEBBROWSER(This));
 }
 
-static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)
+static ULONG WINAPI OleControl_Release(IOleControl *iface)
 {
-    SHDOCVW_UnlockModule();
-
-    return 1; /* non-heap based object */
+    WebBrowser *This = CONTROL_THIS(iface);
+    return IWebBrowser_Release(WEBBROWSER(This));
 }
 
-static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)
+static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, LPCONTROLINFO pCI)
 {
-    FIXME("stub: LPCONTROLINFO = %p\n", pCI);
-    return S_OK;
+    WebBrowser *This = CONTROL_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pCI);
+    return E_NOTIMPL;
 }
 
-static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
+static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, struct tagMSG *pMsg)
 {
-    FIXME("stub: MSG* = %p\n", pMsg);
-    return S_OK;
+    WebBrowser *This = CONTROL_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, pMsg);
+    return E_NOTIMPL;
 }
 
-static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
+static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
 {
-    FIXME("stub: DISPID = %ld\n", dispID);
-    return S_OK;
+    WebBrowser *This = CONTROL_THIS(iface);
+    FIXME("(%p)->(%ld)\n", This, dispID);
+    return E_NOTIMPL;
 }
 
-static HRESULT WINAPI WBOC_FreezeEvents(LPOLECONTROL iface, BOOL bFreeze)
+static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
 {
-    FIXME("stub: bFreeze = %d\n", bFreeze);
-    return S_OK;
+    WebBrowser *This = CONTROL_THIS(iface);
+    FIXME("(%p)->(%x)\n", This, bFreeze);
+    return E_NOTIMPL;
 }
 
-/**********************************************************************
- * IOleControl virtual function table for IE Web Browser component
- */
+#undef CONTROL_THIS
 
-static const IOleControlVtbl WBOC_Vtbl =
+static const IOleControlVtbl OleControlVtbl =
 {
-    WBOC_QueryInterface,
-    WBOC_AddRef,
-    WBOC_Release,
-    WBOC_GetControlInfo,
-    WBOC_OnMnemonic,
-    WBOC_OnAmbientPropertyChange,
-    WBOC_FreezeEvents
+    OleControl_QueryInterface,
+    OleControl_AddRef,
+    OleControl_Release,
+    OleControl_GetControlInfo,
+    OleControl_OnMnemonic,
+    OleControl_OnAmbientPropertyChange,
+    OleControl_FreezeEvents
 };
 
-IOleControlImpl SHDOCVW_OleControl = {&WBOC_Vtbl};
-
 void WebBrowser_OleObject_Init(WebBrowser *This)
 {
-    This->lpOleObjectVtbl = &OleObjectVtbl;
+    This->lpOleObjectVtbl        = &OleObjectVtbl;
+    This->lpOleInPlaceObjectVtbl = &OleInPlaceObjectVtbl;
+    This->lpOleControlVtbl       = &OleControlVtbl;
 }
Index: dlls/shdocvw/shdocvw.h
===================================================================
RCS file: /home/wine/wine/dlls/shdocvw/shdocvw.h,v
retrieving revision 1.16
diff -u -p -r1.16 shdocvw.h
--- dlls/shdocvw/shdocvw.h	6 Sep 2005 11:41:15 -0000	1.16
+++ dlls/shdocvw/shdocvw.h	6 Sep 2005 18:53:16 -0000
@@ -53,14 +53,18 @@ extern IClassFactoryImpl SHDOCVW_ClassFa
  * WebBrowser declaration for SHDOCVW.DLL
  */
 typedef struct {
-    const IWebBrowserVtbl   *lpWebBrowserVtbl;
-    const IOleObjectVtbl    *lpOleObjectVtbl;
+    const IWebBrowserVtbl       *lpWebBrowserVtbl;
+    const IOleObjectVtbl        *lpOleObjectVtbl;
+    const IOleInPlaceObjectVtbl *lpOleInPlaceObjectVtbl;
+    const IOleControlVtbl       *lpOleControlVtbl;
 
     LONG ref;
 } WebBrowser;
 
-#define WEBBROWSER(x)   ((IWebBrowser*)     &(x)->lpWebBrowserVtbl)
-#define OLEOBJ(x)       ((IOleObject*)      &(x)->lpOleObjectVtbl)
+#define WEBBROWSER(x)   ((IWebBrowser*)         &(x)->lpWebBrowserVtbl)
+#define OLEOBJ(x)       ((IOleObject*)          &(x)->lpOleObjectVtbl)
+#define INPLACEOBJ(x)   ((IOleInPlaceObject*)   &(x)->lpOleInPlaceObjectVtbl)
+#define CONTROL(x)      ((IOleControl*)         &(x)->lpOleControlVtbl)
 
 void WebBrowser_OleObject_Init(WebBrowser*);
 
@@ -154,30 +158,6 @@ typedef struct
     LONG ref;
 } IConnectionPointImpl;
 
-/**********************************************************************
- * IOleInPlaceObject declaration for SHDOCVW.DLL
- */
-typedef struct
-{
-        /* IUnknown fields */
-        const IOleInPlaceObjectVtbl *lpVtbl;
-            DWORD ref;
-} IOleInPlaceObjectImpl;
-
-extern IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject;
-
-/**********************************************************************
- * IOleControl declaration for SHDOCVW.DLL
- */
-typedef struct
-{
-    /* IUnknown fields */
-    const IOleControlVtbl *lpVtbl;
-    DWORD ref;
-} IOleControlImpl;
-
-extern IOleControlImpl SHDOCVW_OleControl;
-
 #define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
 
 /**********************************************************************
Index: dlls/shdocvw/webbrowser.c
===================================================================
RCS file: /home/wine/wine/dlls/shdocvw/webbrowser.c,v
retrieving revision 1.14
diff -u -p -r1.14 webbrowser.c
--- dlls/shdocvw/webbrowser.c	6 Sep 2005 11:41:14 -0000	1.14
+++ dlls/shdocvw/webbrowser.c	6 Sep 2005 18:53:16 -0000
@@ -42,14 +42,23 @@ static HRESULT WINAPI WebBrowser_QueryIn
         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
         *ppv = WEBBROWSER(This);
     }else if(IsEqualGUID (&IID_IDispatch, riid)) {
-        FIXME("(%p)->(IID_IDispatch %p)\n", This, ppv);
+        TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
         *ppv = WEBBROWSER(This);
     }else if(IsEqualGUID(&IID_IWebBrowser, riid)) {
         TRACE("(%p)->(IID_IWebBrowser %p)\n", This, ppv);
         *ppv = WEBBROWSER(This);
     }else if(IsEqualGUID(&IID_IOleObject, riid)) {
-        FIXME("(%p)->(IID_IOleObject %p)\n", This, ppv);
+        TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv);
         *ppv = OLEOBJ(This);
+    }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
+        TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
+        *ppv = INPLACEOBJ(This);
+    }else if(IsEqualGUID (&IID_IOleInPlaceObject, riid)) {
+        TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv);
+        *ppv = INPLACEOBJ(This);
+    }else if(IsEqualGUID (&IID_IOleControl, riid)) {
+        FIXME("(%p)->(IID_IOleControl %p)\n", This, ppv);
+        *ppv = CONTROL(This);
     }else if(IsEqualGUID (&IID_IPersistStorage, riid)) {
         FIXME("(%p)->(IID_IPersistStorage %p)\n", This, ppv);
         *ppv = &SHDOCVW_PersistStorage;
@@ -68,12 +77,6 @@ static HRESULT WINAPI WebBrowser_QueryIn
     }else if(IsEqualGUID (&IID_IConnectionPointContainer, riid)) {
         FIXME("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
         *ppv = &SHDOCVW_ConnectionPointContainer;
-    }else if(IsEqualGUID (&IID_IOleInPlaceObject, riid)) {
-        FIXME("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv);
-        *ppv = &SHDOCVW_OleInPlaceObject;
-    }else if(IsEqualGUID (&IID_IOleControl, riid)) {
-        FIXME("(%p)->(IID_IOleControl %p)\n", This, ppv);
-        *ppv = &SHDOCVW_OleControl;
     }
 
     if(*ppv) {


More information about the wine-patches mailing list