Roderick Colenbrander : dinput8: DllGetClassObject support.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 8 15:38:12 CDT 2006


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

Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date:   Sat May  6 20:45:11 2006 +0200

dinput8: DllGetClassObject support.

---

 dlls/dinput8/Makefile.in    |    2 -
 dlls/dinput8/dinput8_main.c |   96 +++++++++++++++++++++++++++++++++++++++----
 2 files changed, 87 insertions(+), 11 deletions(-)

diff --git a/dlls/dinput8/Makefile.in b/dlls/dinput8/Makefile.in
index cd23d04..34135c1 100644
--- a/dlls/dinput8/Makefile.in
+++ b/dlls/dinput8/Makefile.in
@@ -5,7 +5,7 @@ VPATH     = @srcdir@
 MODULE    = dinput8.dll
 IMPORTLIB = libdinput8.$(IMPLIBEXT)
 IMPORTS   = dinput kernel32
-EXTRALIBS = -luuid
+EXTRALIBS = -luuid -ldxguid
 
 C_SRCS = \
 	dinput8_main.c
diff --git a/dlls/dinput8/dinput8_main.c b/dlls/dinput8/dinput8_main.c
index 432d3f1..ad9b2eb 100644
--- a/dlls/dinput8/dinput8_main.c
+++ b/dlls/dinput8/dinput8_main.c
@@ -1,6 +1,7 @@
 /* DirectInput 8
  *
  * Copyright 2002 TransGaming Technologies Inc.
+ * Copyright 2006 Roderick Colenbrander
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -22,6 +23,8 @@ #include <assert.h>
 #include <stdarg.h>
 #include <string.h>
 
+#define COBJMACROS
+
 #include "wine/debug.h"
 #include "windef.h"
 #include "winbase.h"
@@ -29,25 +32,93 @@ #include "winerror.h"
 #include "dinput.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);
+static LONG dll_count;
+
+/*
+ * Dll lifetime tracking declaration
+ */
+static void LockModule(void)
+{
+    InterlockedIncrement(&dll_count);
+}
+
+static void UnlockModule(void)
+{
+    InterlockedDecrement(&dll_count);
+}
 
 /******************************************************************************
  *	DirectInput8Create (DINPUT8.@)
  */
-HRESULT WINAPI DirectInput8Create(
-	HINSTANCE hinst, DWORD dwVersion, REFIID riid, LPVOID *ppDI,
-	LPUNKNOWN punkOuter
-) {
-	return DirectInputCreateEx(hinst, dwVersion, riid, ppDI, punkOuter);
+HRESULT WINAPI DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riid, LPVOID *ppDI, LPUNKNOWN punkOuter) {
+    /* TODO: Create the interface using CoCreateInstance as that's what windows does too and check if the version number >= 0x800 */
+    return DirectInputCreateEx(hinst, dwVersion, riid, ppDI, punkOuter);
+}
+
+/*******************************************************************************
+ * DirectInput8 ClassFactory
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    const IClassFactoryVtbl    *lpVtbl;
+} IClassFactoryImpl;
+
+static HRESULT WINAPI DI8CF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+    FIXME("%p %s %p\n",This,debugstr_guid(riid),ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI DI8CF_AddRef(LPCLASSFACTORY iface) {
+    LockModule();
+    return 2;
 }
 
+static ULONG WINAPI DI8CF_Release(LPCLASSFACTORY iface) {
+    UnlockModule();
+    return 1;
+}
+
+static HRESULT WINAPI DI8CF_CreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj) {
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+
+    TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+    if( IsEqualGUID( &IID_IDirectInput8A, riid ) || IsEqualGUID( &IID_IDirectInput8W, riid ) ) {
+        return DirectInput8Create(0, DIRECTINPUT_VERSION, riid, ppobj, pOuter);
+    }
+
+    ERR("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);    
+    return E_NOINTERFACE;
+}
+
+static HRESULT WINAPI DI8CF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
+    TRACE("(%p)->(%d)\n", iface, dolock);
+
+    if(dolock)
+        LockModule();
+    else
+        UnlockModule();
+
+    return S_OK;
+}
+
+static const IClassFactoryVtbl DI8CF_Vtbl = {
+    DI8CF_QueryInterface,
+    DI8CF_AddRef,
+    DI8CF_Release,
+    DI8CF_CreateInstance,
+    DI8CF_LockServer
+};
+static IClassFactoryImpl DINPUT8_CF = { &DI8CF_Vtbl };
+
+
 /***********************************************************************
  *		DllCanUnloadNow (DINPUT8.@)
  */
 HRESULT WINAPI DllCanUnloadNow(void)
 {
-    FIXME("(void): stub\n");
-
-    return S_FALSE;
+    return dll_count == 0 ? S_OK : S_FALSE;
 }
 
 /***********************************************************************
@@ -55,9 +126,14 @@ HRESULT WINAPI DllCanUnloadNow(void)
  */
 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
 {
-    FIXME("(%p, %p, %p): stub\n", debugstr_guid(rclsid),
-	  debugstr_guid(riid), ppv);
+    TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+    if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
+        *ppv = (LPVOID)&DINPUT8_CF;
+        IClassFactory_AddRef((IClassFactory*)*ppv);
+        return S_OK;
+    }
 
+    FIXME("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
     return CLASS_E_CLASSNOTAVAILABLE;
 }
 




More information about the wine-cvs mailing list