Module: wine Branch: refs/heads/master Commit: c48c50f5756bb4a5bd179f903880b1694f9d9c3d URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c48c50f5756bb4a5bd179f90...
Author: Jacek Caban jacek@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; }
/***********************************************************************