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