Michael Stefaniuc : dplayx: Fix DllGetClassObject().

Alexandre Julliard julliard at winehq.org
Fri Mar 29 12:17:58 CDT 2013


Module: wine
Branch: master
Commit: 99c726dd86b8fd08e1416f8e747f4430ef8abdf9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=99c726dd86b8fd08e1416f8e747f4430ef8abdf9

Author: Michael Stefaniuc <mstefani at redhat.de>
Date:   Fri Mar 29 16:34:04 2013 +0100

dplayx: Fix DllGetClassObject().

---

 dlls/dplayx/dpclassfactory.c |   40 +++++++++++++++-------------------------
 1 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/dlls/dplayx/dpclassfactory.c b/dlls/dplayx/dpclassfactory.c
index 537fe6b..2502e1e 100644
--- a/dlls/dplayx/dpclassfactory.c
+++ b/dlls/dplayx/dpclassfactory.c
@@ -36,13 +36,10 @@
 WINE_DEFAULT_DEBUG_CHANNEL(dplay);
 
 
-/*******************************************************************************
- * DirectPlayLobby ClassFactory
- */
-
 typedef struct
 {
     IClassFactory IClassFactory_iface;
+    HRESULT (*createinstance)(REFIID riid, void **ppv);
 } IClassFactoryImpl;
 
 static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
@@ -78,22 +75,16 @@ static ULONG WINAPI IClassFactoryImpl_Release(IClassFactory *iface)
 }
 
 static HRESULT WINAPI IClassFactoryImpl_CreateInstance(IClassFactory *iface, IUnknown *pOuter,
-        REFIID riid, void **ppobj)
+        REFIID riid, void **ppv)
 {
-        IClassFactoryImpl *This = impl_from_IClassFactory(iface);
+    IClassFactoryImpl *This = impl_from_IClassFactory(iface);
 
-        TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+    TRACE("(%p)->(%p,%s,%p)\n", iface, pOuter, debugstr_guid(riid), ppv);
 
-        if ( DPL_CreateInterface( riid, ppobj ) == S_OK )
-        {
-           return S_OK;
-        }
-        else if ( DP_CreateInterface( riid, ppobj ) == S_OK )
-        {
-           return S_OK;
-        }
+    if (pOuter)
+        return CLASS_E_NOAGGREGATION;
 
-        return E_NOINTERFACE;
+    return This->createinstance(riid, ppv);
 }
 
 static HRESULT WINAPI IClassFactoryImpl_LockServer(IClassFactory *iface, BOOL dolock)
@@ -102,7 +93,7 @@ static HRESULT WINAPI IClassFactoryImpl_LockServer(IClassFactory *iface, BOOL do
     return S_OK;
 }
 
-static const IClassFactoryVtbl DP_and_DPL_Vtbl = {
+static const IClassFactoryVtbl cf_vt = {
     IClassFactoryImpl_QueryInterface,
     IClassFactoryImpl_AddRef,
     IClassFactoryImpl_Release,
@@ -110,7 +101,8 @@ static const IClassFactoryVtbl DP_and_DPL_Vtbl = {
     IClassFactoryImpl_LockServer
 };
 
-static IClassFactoryImpl DP_and_DPL_CF = {{&DP_and_DPL_Vtbl}};
+static IClassFactoryImpl dplay_cf = {{&cf_vt}, DP_CreateInterface};
+static IClassFactoryImpl dplaylobby_cf = {{&cf_vt}, DPL_CreateInterface};
 
 
 /*******************************************************************************
@@ -134,14 +126,12 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
 {
     TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
 
-    if ( IsEqualCLSID( riid, &IID_IClassFactory ) )
-    {
-        *ppv = &DP_and_DPL_CF;
-        IClassFactory_AddRef( (IClassFactory*)*ppv );
+    if (IsEqualCLSID(&CLSID_DirectPlay, rclsid))
+        return IClassFactory_QueryInterface(&dplay_cf.IClassFactory_iface, riid, ppv);
 
-        return S_OK;
-    }
+    if (IsEqualCLSID(&CLSID_DirectPlayLobby, rclsid))
+        return IClassFactory_QueryInterface(&dplaylobby_cf.IClassFactory_iface, riid, ppv);
 
-    ERR("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+    FIXME("(%s,%s,%p): no class found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
     return CLASS_E_CLASSNOTAVAILABLE;
 }




More information about the wine-cvs mailing list