[PATCH] winmm: Instanciate DirectInput8 class using CoCreateInstance.

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


On 12/17/21 17:50, Rémi Bernon wrote:
> On 12/17/21 15:43, Paul Gofman wrote:
>> 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;
>>>   }
>>
> No specific reason except that CoCreateInstance seems to be somewhat a 
> canonical way to create DInput class instances.

But don't you get a chance of getting marshalled interface in theory if 
COM object and thread apartment models do not match? Maybe not in 
practice with dinput8 but isn't just using DirectInput8Create() simpler 
(no COM involved) and is also a valid way?




More information about the wine-devel mailing list