diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index 5fa21f0d6a..f28fe25997 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -417,8 +417,15 @@ static HRESULT WINAPI IDirectInputWImpl_Initialize(LPDIRECTINPUT7W iface, HINSTA static HRESULT WINAPI IDirectInputAImpl_GetDeviceStatus(LPDIRECTINPUT7A iface, REFGUID rguid) { IDirectInputImpl *This = (IDirectInputImpl *)iface; + HRESULT hr; + LPDIRECTINPUTDEVICEA device; - FIXME( "(%p)->(%s): stub\n", This, debugstr_guid(rguid) ); + TRACE( "(%p)->(%s)\n", This, debugstr_guid(rguid) ); + + hr = IDirectInput_CreateDevice( iface, rguid, &device, NULL ); + if (hr != DI_OK) return DI_NOTATTACHED; + + IUnknown_Release( device ); return DI_OK; } diff --git a/dlls/dinput/tests/device.c b/dlls/dinput/tests/device.c index 0088d5b34f..3659530d65 100644 --- a/dlls/dinput/tests/device.c +++ b/dlls/dinput/tests/device.c @@ -124,10 +124,13 @@ static BOOL CALLBACK enum_devices(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) LPDIRECTINPUTDEVICE device; HRESULT hr; - hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, &device, NULL); - ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %s\n", DXGetErrorString8(hr)); - if (SUCCEEDED(hr)) + hr = IDirectInput_GetDeviceStatus(data->pDI, &lpddi->guidInstance); + ok(hr == DI_OK, "IDirectInput_GetDeviceStatus() failed: %s\n", DXGetErrorString8(hr)); + + if (hr == DI_OK) { + hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, &device, NULL); + ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %s\n", DXGetErrorString8(hr)); trace("Testing device \"%s\"\n", lpddi->tszInstanceName); test_object_info(device, data->hwnd); IUnknown_Release(device); @@ -164,6 +167,18 @@ static void device_tests(void) hr = IDirectInput_EnumDevices(pDI, 0, enum_devices, &data, DIEDFL_ALLDEVICES); ok(SUCCEEDED(hr), "IDirectInput_EnumDevices() failed: %s\n", DXGetErrorString8(hr)); + + /* If GetDeviceStatus returns DI_OK the device must exist */ + hr = IDirectInput_GetDeviceStatus(pDI, &GUID_Joystick); + if (hr == DI_OK) + { + LPDIRECTINPUTDEVICE device = NULL; + + hr = IDirectInput_CreateDevice(pDI, &GUID_Joystick, &device, NULL); + ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %s\n", DXGetErrorString8(hr)); + if (device) IUnknown_Release(device); + } + DestroyWindow(hwnd); } if (pDI) IUnknown_Release(pDI);