From 951f4657b796dd128c6797e65fe497faee4f12f5 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Thu, 20 Jul 2006 12:42:23 +0200 Subject: [PATCH] dinput8: DirectInput8Create rewrite. --- dlls/dinput8/Makefile.in | 2 +- dlls/dinput8/dinput8_main.c | 39 +++++++++++++++++++++++++++++++++---- tools/wine.inf | 3 +++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/dlls/dinput8/Makefile.in b/dlls/dinput8/Makefile.in index 34135c124bb..4466d1d45c1 100644 --- a/dlls/dinput8/Makefile.in +++ b/dlls/dinput8/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = dinput8.dll IMPORTLIB = libdinput8.$(IMPLIBEXT) -IMPORTS = dinput kernel32 +IMPORTS = dinput ole32 advapi32 kernel32 EXTRALIBS = -luuid -ldxguid C_SRCS = \ diff --git a/dlls/dinput8/dinput8_main.c b/dlls/dinput8/dinput8_main.c index 54ea66eda1b..95aa9196be4 100644 --- a/dlls/dinput8/dinput8_main.c +++ b/dlls/dinput8/dinput8_main.c @@ -51,8 +51,39 @@ static void UnlockModule(void) * DirectInput8Create (DINPUT8.@) */ 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); + HRESULT hr; + + TRACE("hInst (%p), dwVersion: %ld, riid (%s), punkOuter (%p))\n", hinst, dwVersion, debugstr_guid(riid), punkOuter); + + /* The specified version needs to be dinput8 (0x800) or higher */ + if(dwVersion < 0x800) + return DIERR_OLDDIRECTINPUTVERSION; + + if( !(IsEqualGUID(&IID_IDirectInput8A, riid) || IsEqualGUID(&IID_IDirectInput8W, riid) || IsEqualGUID(&IID_IUnknown, riid)) ) + return DIERR_INVALIDPARAM; + + CoInitialize(NULL); + + hr = CoCreateInstance( &CLSID_DirectInput8, punkOuter, CLSCTX_INPROC_SERVER, riid, ppDI); + if(FAILED(hr)) { + ERR("CoCreateInstance failed with hr = %ld\n", hr); + return DIERR_INVALIDPARAM; + } + + CoUninitialize(); + + /* When aggregation is used (punkOuter!=NULL) the application needs to manually call Initialize. */ + if(punkOuter == NULL && IsEqualGUID(&IID_IDirectInput8A, riid)) { + LPDIRECTINPUTA DI = (LPDIRECTINPUTA)*ppDI; + IDirectInput8_Initialize(DI, hinst, dwVersion); + } + + if(punkOuter == NULL && IsEqualGUID(&IID_IDirectInput8W, riid)) { + LPDIRECTINPUTW DI = (LPDIRECTINPUTW)*ppDI; + IDirectInput8_Initialize(DI, hinst, dwVersion); + } + + return S_OK; } /******************************************************************************* @@ -84,8 +115,8 @@ static HRESULT WINAPI DI8CF_CreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter 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); + if( IsEqualGUID( &IID_IDirectInput8A, riid ) || IsEqualGUID( &IID_IDirectInput8W, riid ) || IsEqualGUID( &IID_IUnknown, riid )) { + return DirectInputCreateEx(0, DIRECTINPUT_VERSION, riid, ppobj, pOuter); } ERR("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj); diff --git a/tools/wine.inf b/tools/wine.inf index d1a280edfe4..316c25a5595 100644 --- a/tools/wine.inf +++ b/tools/wine.inf @@ -126,6 +126,9 @@ HKCR,AVIFile\Extensions\AVI,,,"{00020000-0000-0000-C000-000000000046}" HKCR,AVIFile\Extensions\WAV,,,"{00020003-0000-0000-C000-000000000046}" HKCR,AVIFile\RIFFHandlers\AVI,,,"{00020000-0000-0000-C000-000000000046}" HKCR,AVIFile\RIFFHandlers\WAVE,,,"{00020003-0000-0000-C000-000000000046}" +HKCR,CLSID\{25E609E4-B259-11CF-BFC7-444553540000},,,"DirectInput8 Object" +HKCR,CLSID\{25E609E4-B259-11CF-BFC7-444553540000}\InProcServer32,,,"dinput8.dll" +HKCR,CLSID\{25E609E4-B259-11CF-BFC7-444553540000}\InProcServer32,ThreadingModel,,"Both" HKCR,TypeLib\{00020430-0000-0000-C000-000000000046}\1.0,,,"OLE Automation" HKCR,TypeLib\{00020430-0000-0000-C000-000000000046}\1.0\0\win16,,,"stdole.tlb" HKCR,TypeLib\{00020430-0000-0000-C000-000000000046}\1.0\0\win32,,,"stdole32.tlb"