[PATCH] winmm: Instanciate DirectInput8 class using CoCreateInstance.

Paul Gofman pgofman at codeweavers.com
Fri Dec 17 08:43:41 CST 2021


On 12/17/21 17:20, Rémi Bernon wrote:
> Instead of linking with dinput8.dll 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>
> ---
>   dlls/winmm/Makefile.in |  2 +-
>   dlls/winmm/joystick.c  | 33 +++++++++++++++++++++++++++++----
>   dlls/winmm/winemm.h    |  1 -
>   dlls/winmm/winmm.c     |  2 --
>   4 files changed, 30 insertions(+), 8 deletions(-)
>
> diff --git a/dlls/winmm/Makefile.in b/dlls/winmm/Makefile.in
> index 5439ae21678..3036526c14e 100644
> --- a/dlls/winmm/Makefile.in
> +++ b/dlls/winmm/Makefile.in
> @@ -1,7 +1,7 @@
>   EXTRADEFS = -D_WINMM_
>   MODULE    = winmm.dll
>   IMPORTLIB = winmm
> -IMPORTS   = uuid user32 advapi32 ole32 msacm32 dinput8
> +IMPORTS   = uuid user32 advapi32 ole32 msacm32
>   
>   C_SRCS = \
>   	driver.c \
> diff --git a/dlls/winmm/joystick.c b/dlls/winmm/joystick.c
> index 5f5683e3e35..74bf53eac08 100644
> --- a/dlls/winmm/joystick.c
> +++ b/dlls/winmm/joystick.c
> @@ -152,11 +152,31 @@ static BOOL CALLBACK enum_instances( const DIDEVICEINSTANCEW *instance, void *co
>       return DIENUM_CONTINUE;
>   }
>   
> -void joystick_load( HINSTANCE instance )
> +static BOOL WINAPI joystick_load( INIT_ONCE *once, void *param, void **context )
>   {
> -    HRESULT hr = DirectInput8Create( instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W,
> -                                     (void **)&dinput, NULL );
> -    if (FAILED(hr)) WARN( "could not create dinput instance, hr %#x\n", hr );
> +    HRESULT hr;
> +
> +    CoInitialize( NULL );
> +
> +    hr = CoCreateInstance( &CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput8W,
> +                           (void **)&dinput );
> +    if (FAILED(hr))
> +    {
> +        WARN( "Could not create dinput instance, hr %#x\n", hr );
> +        CoUninitialize();
> +        return FALSE;
> +    }
> +
> +    hr = IDirectInput8_Initialize( dinput, hWinMM32Instance, DIRECTINPUT_VERSION );
> +    if (FAILED(hr))
> +    {
> +        WARN( "Could not initialize dinput instance, hr %#x\n", hr );
> +        IDirectInput8_Release( dinput );
> +        CoUninitialize();
> +        return FALSE;
> +    }
> +
> +    return TRUE;
>   }
>   

This is probably not in a winmm own created thread, right? In that case 
CoInitialize will fail if COM is already initialized as MT apartment. 
Which is probably not an issue by itself, but then CoUnitialize() may 
leave app's thread with uninit the app's thread initialization, so 
CoInitialize() return status should be considered. And propaply 
CoUninitialize() is missing on success return?

Apart from that, is there any reason not to just LoadLibrary()/ 
GetProcAddress("DirectInput8Create")?





More information about the wine-devel mailing list