[PATCH v3] winmm: Instanciate DirectInput8 class lazily using delay imported DLL.

Andrew Eikum aeikum at codeweavers.com
Tue Dec 21 09:22:56 CST 2021


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

---

I'm not great at loader stuff, but I don't see any problems.

On Fri, Dec 17, 2021 at 04:42:05PM +0100, Rémi Bernon wrote:
> 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>
> ---
> 
> v3: Use lazy init and delay load instead of COM.
> 
>  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)
> -- 
> 2.34.0
> 
> 



More information about the wine-devel mailing list