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@codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2021-12-17 16:42:05 +01:00 committed by Alexandre Julliard
parent c521ec04c9
commit e9282254c6
4 changed files with 10 additions and 7 deletions

View File

@ -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 \

View File

@ -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;

View File

@ -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 */

View File

@ -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)