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