Roderick Colenbrander : dinput8: DirectInput8Create rewrite.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 21 04:14:31 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 951f4657b796dd128c6797e65fe497faee4f12f5
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=951f4657b796dd128c6797e65fe497faee4f12f5
Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date: Thu Jul 20 12:42:23 2006 +0200
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 34135c1..4466d1d 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 54ea66e..95aa919 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_CreateInstan
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 d1a280e..316c25a 100644
--- a/tools/wine.inf
+++ b/tools/wine.inf
@@ -126,6 +126,9 @@ HKCR,AVIFile\Extensions\AVI,,,"{00020000
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"
More information about the wine-cvs
mailing list