Jacek Caban : shdocvw: Move DllGetClassObject implementation to factory.c.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Apr 20 04:39:55 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: c48c50f5756bb4a5bd179f903880b1694f9d9c3d
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=c48c50f5756bb4a5bd179f903880b1694f9d9c3d

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr 19 20:31:59 2006 +0200

shdocvw: Move DllGetClassObject implementation to factory.c.

---

 dlls/shdocvw/factory.c      |   27 ++++++++++++++++++++++----
 dlls/shdocvw/shdocvw.h      |    3 ++-
 dlls/shdocvw/shdocvw_main.c |   44 +++++++++++--------------------------------
 3 files changed, 35 insertions(+), 39 deletions(-)

diff --git a/dlls/shdocvw/factory.c b/dlls/shdocvw/factory.c
index 264539a..2fa096e 100644
--- a/dlls/shdocvw/factory.c
+++ b/dlls/shdocvw/factory.c
@@ -30,10 +30,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
  * (Based on implementation in ddraw/main.c)
  */
 
+#define FACTORY(x) ((IClassFactory*) &(x)->lpClassFactoryVtbl)
+
 typedef struct
 {
     /* IUnknown fields */
-    const IClassFactoryVtbl *lpVtbl;
+    const IClassFactoryVtbl *lpClassFactoryVtbl;
     HRESULT (*cf)(LPUNKNOWN, REFIID, LPVOID *);
     LONG ref;
 } IClassFactoryImpl;
@@ -115,9 +117,24 @@ static const IClassFactoryVtbl WBCF_Vtbl
     WBCF_LockServer
 };
 
-static IClassFactoryImpl SHDOCVW_WBClassFactory = {&WBCF_Vtbl, WebBrowser_Create};
-
-IClassFactory *get_class_factory(void)
+/*************************************************************************
+ *              DllGetClassObject (SHDOCVW.@)
+ */
+HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
 {
-    return (IClassFactory*) &SHDOCVW_WBClassFactory;
+    HRESULT hres;
+
+    static IClassFactoryImpl WBClassFactory = {&WBCF_Vtbl, WebBrowser_Create};
+
+    TRACE("\n");
+
+    if(IsEqualGUID(&CLSID_WebBrowser, rclsid))  {
+        hres = create_mozctl(riid, ppv);
+        if(SUCCEEDED(hres))
+            return hres;
+        return IClassFactory_QueryInterface(FACTORY(&WBClassFactory), riid, ppv);
+    }
+
+    /* As a last resort, figure if the CLSID belongs to a 'Shell Instance Object' */
+    return SHDOCVW_GetShellInstanceObjectClassObject(rclsid, riid, ppv);
 }
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h
index 66730cf..a86a595 100644
--- a/dlls/shdocvw/shdocvw.h
+++ b/dlls/shdocvw/shdocvw.h
@@ -169,6 +169,8 @@ void deactivate_document(DocHost*);
 void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*);
 HRESULT navigate_url(DocHost*,LPCWSTR,PBYTE,ULONG,LPWSTR);
 
+HRESULT create_mozctl(REFIID,void**);
+
 #define WB_WM_NAVIGATE2 (WM_USER+100)
 
 #define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
@@ -184,6 +186,5 @@ extern HINSTANCE shdocvw_hinstance;
 extern void register_iewindow_class(void);
 extern void unregister_iewindow_class(void);
 extern BOOL create_ie_window(LPCWSTR url);
-extern IClassFactory *get_class_factory(void);
 
 #endif /* __WINE_SHDOCVW_H */
diff --git a/dlls/shdocvw/shdocvw_main.c b/dlls/shdocvw/shdocvw_main.c
index f192db7..e936095 100644
--- a/dlls/shdocvw/shdocvw_main.c
+++ b/dlls/shdocvw/shdocvw_main.c
@@ -444,46 +444,24 @@ static BOOL SHDOCVW_TryLoadMozillaContro
     }
 }
 
-/*************************************************************************
- *              DllGetClassObject (SHDOCVW.@)
- */
-HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+HRESULT create_mozctl(REFIID riid, void **ppv)
 {
-    TRACE("\n");
-
-    if( IsEqualGUID( &CLSID_WebBrowser, rclsid ) &&
-        SHDOCVW_TryLoadMozillaControl() )
-    {
-        HRESULT r;
-        fnGetClassObject pGetClassObject;
-
-        TRACE("WebBrowser class %s\n", debugstr_guid(rclsid) );
+    fnGetClassObject pGetClassObject;
+    HRESULT hres;
 
-        pGetClassObject = (fnGetClassObject)
-            GetProcAddress( hMozCtl, "DllGetClassObject" );
+    if(!SHDOCVW_TryLoadMozillaControl())
+        return CLASS_E_CLASSNOTAVAILABLE;
 
-        if( !pGetClassObject )
-            return CLASS_E_CLASSNOTAVAILABLE;
-        r = pGetClassObject( &CLSID_MozillaBrowser, riid, ppv );
+    pGetClassObject = (fnGetClassObject)GetProcAddress( hMozCtl, "DllGetClassObject" );
 
-        TRACE("r = %08lx  *ppv = %p\n", r, *ppv );
+    if( !pGetClassObject )
+        return CLASS_E_CLASSNOTAVAILABLE;
 
-        return r;
-    }
-
-    if (IsEqualCLSID(&CLSID_WebBrowser, rclsid) &&
-        IsEqualIID(&IID_IClassFactory, riid))
-    {
-        /* Pass back our shdocvw class factory */
-        IClassFactory *cf = get_class_factory();
-        IClassFactory_AddRef(cf);
-        *ppv = cf;
+    hres = pGetClassObject( &CLSID_MozillaBrowser, riid, ppv );
 
-        return S_OK;
-    }
+    TRACE("hres = %08lx  *ppv = %p\n", hres, *ppv );
 
-    /* As a last resort, figure if the CLSID belongs to a 'Shell Instance Object' */
-    return SHDOCVW_GetShellInstanceObjectClassObject(rclsid, riid, ppv);
+    return hres;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list