Rémi Bernon : dinput: Cleanup DllGetClassObject and IClassFactory implementation.
Alexandre Julliard
julliard at winehq.org
Mon Feb 7 15:56:05 CST 2022
Module: wine
Branch: master
Commit: ac7ff2611d418ea40bfa6cbf4c92bd793b2e4349
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ac7ff2611d418ea40bfa6cbf4c92bd793b2e4349
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Mon Feb 7 09:23:26 2022 +0100
dinput: Cleanup DllGetClassObject and IClassFactory implementation.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dinput/dinput_main.c | 121 +++++++++++++++++++++++----------------------
dlls/dinput/tests/dinput.c | 1 -
2 files changed, 63 insertions(+), 59 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index dbb727c3c43..2172eb32ee9 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -1089,90 +1089,95 @@ static const IDirectInputJoyConfig8Vtbl JoyConfig8vt =
JoyConfig8Impl_OpenAppStatusKey
};
-/*******************************************************************************
- * DirectInput ClassFactory
- */
-typedef struct
+struct class_factory
{
- /* IUnknown fields */
IClassFactory IClassFactory_iface;
- LONG ref;
-} IClassFactoryImpl;
+};
-static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
+static inline struct class_factory *impl_from_IClassFactory( IClassFactory *iface )
{
- return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
+ return CONTAINING_RECORD( iface, struct class_factory, IClassFactory_iface );
}
-static HRESULT WINAPI DICF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
- IClassFactoryImpl *This = impl_from_IClassFactory(iface);
+static HRESULT WINAPI class_factory_QueryInterface( IClassFactory *iface, REFIID iid, void **out )
+{
+ struct class_factory *impl = impl_from_IClassFactory(iface);
+
+ TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
- FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
- return E_NOINTERFACE;
+ if (IsEqualGUID(iid, &IID_IUnknown) ||
+ IsEqualGUID(iid, &IID_IClassFactory))
+ *out = &impl->IClassFactory_iface;
+ else
+ {
+ *out = NULL;
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI DICF_AddRef(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = impl_from_IClassFactory(iface);
- return InterlockedIncrement(&(This->ref));
+static ULONG WINAPI class_factory_AddRef( IClassFactory *iface )
+{
+ return 2;
}
-static ULONG WINAPI DICF_Release(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = impl_from_IClassFactory(iface);
- /* static class, won't be freed */
- return InterlockedDecrement(&(This->ref));
+static ULONG WINAPI class_factory_Release( IClassFactory *iface )
+{
+ return 1;
}
-static HRESULT WINAPI DICF_CreateInstance(
- LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
-) {
- IClassFactoryImpl *This = impl_from_IClassFactory(iface);
+static HRESULT WINAPI class_factory_CreateInstance( IClassFactory *iface, IUnknown *outer, REFIID iid, void **out )
+{
+ IUnknown *unknown;
+ HRESULT hr;
- TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
- if ( IsEqualGUID( &IID_IUnknown, riid ) ||
- IsEqualGUID( &IID_IDirectInputA, riid ) ||
- IsEqualGUID( &IID_IDirectInputW, riid ) ||
- IsEqualGUID( &IID_IDirectInput2A, riid ) ||
- IsEqualGUID( &IID_IDirectInput2W, riid ) ||
- IsEqualGUID( &IID_IDirectInput7A, riid ) ||
- IsEqualGUID( &IID_IDirectInput7W, riid ) ||
- IsEqualGUID( &IID_IDirectInput8A, riid ) ||
- IsEqualGUID( &IID_IDirectInput8W, riid ) )
- {
- return create_directinput_instance(riid, ppobj, NULL);
- }
+ TRACE( "iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid( iid ), out );
+
+ if (outer) return CLASS_E_NOAGGREGATION;
- FIXME("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);
- return E_NOINTERFACE;
+ if (FAILED(hr = create_directinput_instance( &IID_IUnknown, (void **)&unknown, NULL ))) return hr;
+ hr = IUnknown_QueryInterface( unknown, iid, out );
+ IUnknown_Release( unknown );
+
+ return hr;
}
-static HRESULT WINAPI DICF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
- IClassFactoryImpl *This = impl_from_IClassFactory(iface);
- FIXME("(%p)->(%d),stub!\n",This,dolock);
- return S_OK;
+static HRESULT WINAPI class_factory_LockServer( IClassFactory *iface, BOOL lock )
+{
+ FIXME( "iface %p, lock %d stub!\n", iface, lock );
+ return S_OK;
}
-static const IClassFactoryVtbl DICF_Vtbl = {
- DICF_QueryInterface,
- DICF_AddRef,
- DICF_Release,
- DICF_CreateInstance,
- DICF_LockServer
+static const IClassFactoryVtbl class_factory_vtbl =
+{
+ class_factory_QueryInterface,
+ class_factory_AddRef,
+ class_factory_Release,
+ class_factory_CreateInstance,
+ class_factory_LockServer,
};
-static IClassFactoryImpl DINPUT_CF = {{&DICF_Vtbl}, 1 };
+
+static struct class_factory class_factory = {{&class_factory_vtbl}};
/***********************************************************************
* DllGetClassObject (DINPUT.@)
*/
-HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+HRESULT WINAPI DllGetClassObject( REFCLSID clsid, REFIID iid, void **out )
{
- TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
- if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
- *ppv = &DINPUT_CF;
- IClassFactory_AddRef((IClassFactory*)*ppv);
- return S_OK;
- }
+ TRACE( "clsid %s, iid %s, out %p.\n", debugstr_guid( clsid ), debugstr_guid( iid ), out );
+
+#if DIRECTINPUT_VERSION == 0x0700
+ if (IsEqualCLSID( &CLSID_DirectInput, clsid ))
+ return IClassFactory_QueryInterface( &class_factory.IClassFactory_iface, iid, out );
+#else
+ if (IsEqualCLSID( &CLSID_DirectInput8, clsid ))
+ return IClassFactory_QueryInterface( &class_factory.IClassFactory_iface, iid, out );
+#endif
- FIXME("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+ WARN( "%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid( clsid ) );
return CLASS_E_CLASSNOTAVAILABLE;
}
diff --git a/dlls/dinput/tests/dinput.c b/dlls/dinput/tests/dinput.c
index a2c7f5dbd8d..0b3ce276e52 100644
--- a/dlls/dinput/tests/dinput.c
+++ b/dlls/dinput/tests/dinput.c
@@ -167,7 +167,6 @@ static void test_CoCreateInstance( DWORD version )
&IID_IDirectInputA, (void **)&unknown );
else hr = CoCreateInstance( &CLSID_DirectInput8, &outer, CLSCTX_INPROC_SERVER,
&IID_IDirectInput8A, (void **)&unknown );
- todo_wine
ok( hr == CLASS_E_NOAGGREGATION, "CoCreateInstance returned %#x\n", hr );
if (SUCCEEDED( hr )) IUnknown_Release( unknown );
More information about the wine-cvs
mailing list