Rémi Bernon : winmm: Instanciate DirectInput8 class lazily using delay imported DLL.

Alexandre Julliard julliard at winehq.org
Tue Dec 21 15:16:33 CST 2021


Module: wine
Branch: master
Commit: e9282254c6824c4387d3a6368c7fb8ca44aeef53
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e9282254c6824c4387d3a6368c7fb8ca44aeef53

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Fri Dec 17 16:42:05 2021 +0100

winmm: Instanciate DirectInput8 class lazily using delay imported DLL.

Instead of statically importing dinput8 and creating the class at load
time, which causes some native hooks to fail loading.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52222
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winmm/Makefile.in |  3 ++-
 dlls/winmm/joystick.c  | 11 ++++++++---
 dlls/winmm/winemm.h    |  1 -
 dlls/winmm/winmm.c     |  2 --
 4 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/dlls/winmm/Makefile.in b/dlls/winmm/Makefile.in
index 5439ae21678..c515a3aba2e 100644
--- a/dlls/winmm/Makefile.in
+++ b/dlls/winmm/Makefile.in
@@ -1,7 +1,8 @@
 EXTRADEFS = -D_WINMM_
 MODULE    = winmm.dll
 IMPORTLIB = winmm
-IMPORTS   = uuid user32 advapi32 ole32 msacm32 dinput8
+IMPORTS   = uuid user32 advapi32 ole32 msacm32
+DELAYIMPORTS = dinput8
 
 C_SRCS = \
 	driver.c \
diff --git a/dlls/winmm/joystick.c b/dlls/winmm/joystick.c
index 5f5683e3e35..5a6e1203513 100644
--- a/dlls/winmm/joystick.c
+++ b/dlls/winmm/joystick.c
@@ -152,11 +152,12 @@ static BOOL CALLBACK enum_instances( const DIDEVICEINSTANCEW *instance, void *co
     return DIENUM_CONTINUE;
 }
 
-void joystick_load( HINSTANCE instance )
+static BOOL WINAPI joystick_load_once( INIT_ONCE *once, void *param, void **context )
 {
-    HRESULT hr = DirectInput8Create( instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W,
+    HRESULT hr = DirectInput8Create( hWinMM32Instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W,
                                      (void **)&dinput, NULL );
-    if (FAILED(hr)) WARN( "could not create dinput instance, hr %#x\n", hr );
+    if (FAILED(hr)) ERR( "Could not create dinput instance, hr %#x\n", hr );
+    return TRUE;
 }
 
 void joystick_unload()
@@ -177,11 +178,15 @@ void joystick_unload()
 
 static void find_joysticks(void)
 {
+    static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
+
     IDirectInputDevice8W *device;
     HANDLE event;
     DWORD index;
     HRESULT hr;
 
+    InitOnceExecuteOnce( &init_once, joystick_load_once, NULL, NULL );
+
     if (!dinput) return;
 
     index = 0;
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h
index 3459c2a85ef..52cab64b1c5 100644
--- a/dlls/winmm/winemm.h
+++ b/dlls/winmm/winemm.h
@@ -153,7 +153,6 @@ MMRESULT WINMM_CheckCallback(DWORD_PTR dwCallback, DWORD fdwOpen, BOOL mixer) DE
 
 void WINMM_DeleteWaveform(void) DECLSPEC_HIDDEN;
 
-void joystick_load( HMODULE instance ) DECLSPEC_HIDDEN;
 void joystick_unload( void ) DECLSPEC_HIDDEN;
 
 /* Global variables */
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index aab8bfb51a9..aa2dd50c4c1 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -144,8 +144,6 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
 
         if (!WINMM_CreateIData(hInstDLL))
             return FALSE;
-
-        joystick_load( hInstDLL );
         break;
     case DLL_PROCESS_DETACH:
         if(fImpLoad)




More information about the wine-cvs mailing list