dinput: Combine ASCII and Unicode device create callbacks. Add tests.

This commit is contained in:
Vitaliy Margolen 2011-01-23 12:44:20 -07:00 committed by Alexandre Julliard
parent 27d31c7652
commit 0ac5c60374
8 changed files with 219 additions and 257 deletions

View File

@ -504,8 +504,8 @@ static HRESULT WINAPI IDirectInput7AImpl_CreateDeviceEx(LPDIRECTINPUT7A iface, R
for (i = 0; i < NB_DINPUT_DEVICES; i++) {
HRESULT ret;
if (!dinput_devices[i]->create_deviceA) continue;
if ((ret = dinput_devices[i]->create_deviceA(This, rguid, riid, (LPDIRECTINPUTDEVICEA*) pvOut)) == DI_OK)
if (!dinput_devices[i]->create_device) continue;
if ((ret = dinput_devices[i]->create_device(This, rguid, riid, pvOut, 0)) == DI_OK)
return DI_OK;
if (ret == DIERR_NOINTERFACE)
@ -535,8 +535,8 @@ static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, R
for (i = 0; i < NB_DINPUT_DEVICES; i++) {
HRESULT ret;
if (!dinput_devices[i]->create_deviceW) continue;
if ((ret = dinput_devices[i]->create_deviceW(This, rguid, riid, (LPDIRECTINPUTDEVICEW*) pvOut)) == DI_OK)
if (!dinput_devices[i]->create_device) continue;
if ((ret = dinput_devices[i]->create_device(This, rguid, riid, pvOut, 1)) == DI_OK)
return DI_OK;
if (ret == DIERR_NOINTERFACE)

View File

@ -50,8 +50,7 @@ struct dinput_device {
const char *name;
BOOL (*enum_deviceA)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id);
BOOL (*enum_deviceW)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id);
HRESULT (*create_deviceA)(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev);
HRESULT (*create_deviceW)(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev);
HRESULT (*create_device)(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode);
};
extern const struct dinput_device mouse_device;

View File

@ -450,76 +450,63 @@ static unsigned short get_joystick_index(REFGUID guid)
return MAX_JOYSTICKS;
}
static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode)
{
unsigned short index;
TRACE("%p %s %p %p\n",dinput, debugstr_guid(rguid), riid, pdev);
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
find_joystick_devices();
*pdev = NULL;
if ((index = get_joystick_index(rguid)) < MAX_JOYSTICKS &&
joystick_devices_count && index < joystick_devices_count)
{
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceA, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{
JoystickImpl *This;
HRESULT hr = alloc_device(rguid, dinput, &This, index);
JoystickImpl *This;
HRESULT hr;
*pdev = (LPDIRECTINPUTDEVICEA)(This ? &This->generic.base.IDirectInputDevice8A_iface : NULL);
return hr;
if (riid == NULL)
;/* nothing */
else if (IsEqualGUID(&IID_IDirectInputDeviceA, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{
unicode = 0;
}
else if (IsEqualGUID(&IID_IDirectInputDeviceW, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{
unicode = 1;
}
else
{
WARN("no interface\n");
return DIERR_NOINTERFACE;
}
WARN("no interface\n");
return DIERR_NOINTERFACE;
hr = alloc_device(rguid, dinput, &This, index);
if (!This) return hr;
if (unicode)
*pdev = &This->generic.base.IDirectInputDevice8W_iface;
else
*pdev = &This->generic.base.IDirectInputDevice8A_iface;
return hr;
}
return DIERR_DEVICENOTREG;
}
static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev)
{
unsigned short index;
TRACE("%p %s %p %p\n",dinput, debugstr_guid(rguid), riid, pdev);
find_joystick_devices();
*pdev = NULL;
if ((index = get_joystick_index(rguid)) < MAX_JOYSTICKS &&
joystick_devices_count && index < joystick_devices_count)
{
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceW, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{
JoystickImpl *This;
HRESULT hr = alloc_device(rguid, dinput, &This, index);
*pdev = (LPDIRECTINPUTDEVICEW)(This ? &This->generic.base.IDirectInputDevice8W_iface : NULL);
return hr;
}
WARN("no interface\n");
return DIERR_NOINTERFACE;
}
WARN("invalid device GUID %s\n",debugstr_guid(rguid));
return DIERR_DEVICENOTREG;
}
#undef MAX_JOYSTICKS
const struct dinput_device joystick_linux_device = {
"Wine Linux joystick driver",
joydev_enum_deviceA,
joydev_enum_deviceW,
joydev_create_deviceA,
joydev_create_deviceW
joydev_create_device
};
/******************************************************************************
@ -742,7 +729,6 @@ const struct dinput_device joystick_linux_device = {
"Wine Linux joystick driver",
NULL,
NULL,
NULL,
NULL
};

View File

@ -560,82 +560,63 @@ static unsigned short get_joystick_index(REFGUID guid)
return MAX_JOYDEV;
}
static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode)
{
unsigned short index;
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
find_joydevs();
*pdev = NULL;
if ((index = get_joystick_index(rguid)) < MAX_JOYDEV &&
have_joydevs && index < have_joydevs)
{
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceA, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{
JoystickImpl *This = alloc_device(rguid, dinput, index);
TRACE("Created a Joystick device (%p)\n", This);
JoystickImpl *This;
if (!This)
{
ERR("out of memory\n");
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceA*) &This->generic.base.IDirectInputDevice8A_iface;
return DI_OK;
if (riid == NULL)
;/* nothing */
else if (IsEqualGUID(&IID_IDirectInputDeviceA, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{
unicode = 0;
}
else if (IsEqualGUID(&IID_IDirectInputDeviceW, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{
unicode = 1;
}
else
{
WARN("no interface\n");
return DIERR_NOINTERFACE;
}
WARN("no interface\n");
return DIERR_NOINTERFACE;
This = alloc_device(rguid, dinput, index);
TRACE("Created a Joystick device (%p)\n", This);
if (!This) return DIERR_OUTOFMEMORY;
if (unicode)
*pdev = &This->generic.base.IDirectInputDevice8W_iface;
else
*pdev = &This->generic.base.IDirectInputDevice8A_iface;
return DI_OK;
}
return DIERR_DEVICENOTREG;
}
static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev)
{
unsigned short index;
find_joydevs();
if ((index = get_joystick_index(rguid)) < MAX_JOYDEV &&
have_joydevs && index < have_joydevs)
{
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceW, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{
JoystickImpl *This = alloc_device(rguid, dinput, index);
TRACE("Created a Joystick device (%p)\n", This);
if (!This)
{
ERR("out of memory\n");
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceW*) &This->generic.base.IDirectInputDevice8W_iface;
return DI_OK;
}
WARN("no interface\n");
return DIERR_NOINTERFACE;
}
WARN("invalid device GUID\n");
return DIERR_DEVICENOTREG;
}
const struct dinput_device joystick_linuxinput_device = {
"Wine Linux-input joystick driver",
joydev_enum_deviceA,
joydev_enum_deviceW,
joydev_create_deviceA,
joydev_create_deviceW
joydev_create_device
};
/******************************************************************************
@ -1456,7 +1437,6 @@ const struct dinput_device joystick_linuxinput_device = {
"Wine Linux-input joystick driver",
NULL,
NULL,
NULL,
NULL
};

View File

@ -878,12 +878,12 @@ static unsigned short get_joystick_index(REFGUID guid)
return 0xffff;
}
static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode)
{
unsigned short index;
int joystick_devices_count;
TRACE("%p %s %p %p\n",dinput, debugstr_guid(rguid), riid, pdev);
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
*pdev = NULL;
if ((joystick_devices_count = find_joystick_devices()) == 0)
@ -892,66 +892,49 @@ static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, RE
if ((index = get_joystick_index(rguid)) < 0xffff &&
joystick_devices_count && index < joystick_devices_count)
{
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceA, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{
JoystickImpl *This;
HRESULT hr = alloc_device(rguid, dinput, &This, index);
JoystickImpl *This;
HRESULT hr;
*pdev = (LPDIRECTINPUTDEVICEA)(This ? &This->generic.base.IDirectInputDevice8A_iface : NULL);
return hr;
if (riid == NULL)
;/* nothing */
else if (IsEqualGUID(&IID_IDirectInputDeviceA, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{
unicode = 0;
}
else if (IsEqualGUID(&IID_IDirectInputDeviceW, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{
unicode = 1;
}
else
{
WARN("no interface\n");
return DIERR_NOINTERFACE;
}
WARN("no interface\n");
return DIERR_NOINTERFACE;
hr = alloc_device(rguid, dinput, &This, index);
if (!This) return hr;
if (unicode)
*pdev = &This->generic.base.IDirectInputDevice8W_iface;
else
*pdev = &This->generic.base.IDirectInputDevice8A_iface;
return hr;
}
return DIERR_DEVICENOTREG;
}
static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev)
{
unsigned short index;
int joystick_devices_count;
TRACE("%p %s %p %p\n",dinput, debugstr_guid(rguid), riid, pdev);
*pdev = NULL;
if ((joystick_devices_count = find_joystick_devices()) == 0)
return DIERR_DEVICENOTREG;
if ((index = get_joystick_index(rguid)) < 0xffff &&
joystick_devices_count && index < joystick_devices_count)
{
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceW, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{
JoystickImpl *This;
HRESULT hr = alloc_device(rguid, dinput, &This, index);
*pdev = (LPDIRECTINPUTDEVICEW)(This ? &This->generic.base.IDirectInputDevice8W_iface : NULL);
return hr;
}
WARN("no interface\n");
return DIERR_NOINTERFACE;
}
WARN("invalid device GUID %s\n",debugstr_guid(rguid));
return DIERR_DEVICENOTREG;
}
const struct dinput_device joystick_osx_device = {
"Wine OS X joystick driver",
joydev_enum_deviceA,
joydev_enum_deviceW,
joydev_create_deviceA,
joydev_create_deviceW
joydev_create_device
};
static const IDirectInputDevice8AVtbl JoystickAvt =
@ -1032,7 +1015,6 @@ const struct dinput_device joystick_osx_device = {
"Wine OS X joystick driver",
NULL,
NULL,
NULL,
NULL
};

View File

@ -270,60 +270,59 @@ failed:
}
static HRESULT keyboarddev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
static HRESULT keyboarddev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode)
{
if ((IsEqualGUID(&GUID_SysKeyboard,rguid)) || /* Generic Keyboard */
(IsEqualGUID(&DInput_Wine_Keyboard_GUID,rguid))) { /* Wine Keyboard */
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceA,riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
*pdev = NULL;
SysKeyboardImpl *This = alloc_device(rguid, dinput);
if (!This) {
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceA*) &This->base.IDirectInputDevice8A_iface;
TRACE("Creating a Keyboard device (%p)\n", *pdev);
return DI_OK;
} else
return DIERR_NOINTERFACE;
}
return DIERR_DEVICENOTREG;
}
if (IsEqualGUID(&GUID_SysKeyboard, rguid) || /* Generic Keyboard */
IsEqualGUID(&DInput_Wine_Keyboard_GUID, rguid)) /* Wine Keyboard */
{
SysKeyboardImpl *This;
static HRESULT keyboarddev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev)
{
if ((IsEqualGUID(&GUID_SysKeyboard,rguid)) || /* Generic Keyboard */
(IsEqualGUID(&DInput_Wine_Keyboard_GUID,rguid))) { /* Wine Keyboard */
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceW,riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
if (riid == NULL)
;/* nothing */
else if (IsEqualGUID(&IID_IDirectInputDeviceA, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{
unicode = 0;
}
else if (IsEqualGUID(&IID_IDirectInputDeviceW, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{
unicode = 1;
}
else
{
WARN("no interface\n");
return DIERR_NOINTERFACE;
}
SysKeyboardImpl *This = alloc_device(rguid, dinput);
if (!This) {
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceW*) &This->base.IDirectInputDevice8W_iface;
TRACE("Creating a Keyboard device (%p)\n", *pdev);
return DI_OK;
} else
return DIERR_NOINTERFACE;
}
return DIERR_DEVICENOTREG;
This = alloc_device(rguid, dinput);
TRACE("Created a Keyboard device (%p)\n", This);
if (!This) return DIERR_OUTOFMEMORY;
if (unicode)
*pdev = &This->base.IDirectInputDevice8W_iface;
else
*pdev = &This->base.IDirectInputDevice8A_iface;
return DI_OK;
}
return DIERR_DEVICENOTREG;
}
const struct dinput_device keyboard_device = {
"Wine keyboard driver",
keyboarddev_enum_deviceA,
keyboarddev_enum_deviceW,
keyboarddev_create_deviceA,
keyboarddev_create_deviceW
keyboarddev_create_device
};
static HRESULT WINAPI SysKeyboardWImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface, DWORD len, LPVOID ptr)

View File

@ -256,55 +256,51 @@ failed:
return NULL;
}
static HRESULT mousedev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
static HRESULT mousedev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode)
{
if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */
(IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceA,riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
*pdev = NULL;
SysMouseImpl* This = alloc_device(rguid, dinput);
TRACE("Created a Mouse device (%p)\n", This);
if (IsEqualGUID(&GUID_SysMouse, rguid) || /* Generic Mouse */
IsEqualGUID(&DInput_Wine_Mouse_GUID, rguid)) /* Wine Mouse */
{
SysMouseImpl *This;
if (!This) {
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceA*) &This->base.IDirectInputDevice8A_iface;
return DI_OK;
} else
return DIERR_NOINTERFACE;
if (riid == NULL)
;/* nothing */
else if (IsEqualGUID(&IID_IDirectInputDeviceA, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8A, riid))
{
unicode = 0;
}
else if (IsEqualGUID(&IID_IDirectInputDeviceW, riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W, riid))
{
unicode = 1;
}
else
{
WARN("no interface\n");
return DIERR_NOINTERFACE;
}
This = alloc_device(rguid, dinput);
TRACE("Created a Mouse device (%p)\n", This);
if (!This) return DIERR_OUTOFMEMORY;
if (unicode)
*pdev = &This->base.IDirectInputDevice8W_iface;
else
*pdev = &This->base.IDirectInputDevice8A_iface;
return DI_OK;
}
return DIERR_DEVICENOTREG;
}
static HRESULT mousedev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev)
{
if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */
(IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */
if ((riid == NULL) ||
IsEqualGUID(&IID_IDirectInputDeviceW,riid) ||
IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||
IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||
IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
SysMouseImpl* This = alloc_device(rguid, dinput);
TRACE("Created a Mouse device (%p)\n", This);
if (!This) {
*pdev = NULL;
return DIERR_OUTOFMEMORY;
}
*pdev = (IDirectInputDeviceW*) &This->base.IDirectInputDevice8W_iface;
return DI_OK;
} else
return DIERR_NOINTERFACE;
}
return DIERR_DEVICENOTREG;
}
@ -312,8 +308,7 @@ const struct dinput_device mouse_device = {
"Wine mouse driver",
mousedev_enum_deviceA,
mousedev_enum_deviceW,
mousedev_create_deviceA,
mousedev_create_deviceW
mousedev_create_device
};
/******************************************************************************

View File

@ -109,6 +109,8 @@ static void test_object_info(LPDIRECTINPUTDEVICE device, HWND hwnd)
ok(hr == DI_OK, "Acquire() failed: %08x\n", hr);
hr = IDirectInputDevice_SetProperty(device, DIPROP_AXISMODE, &dp.diph);
ok(hr == DIERR_ACQUIRED, "SetProperty() returned: %08x\n", hr);
hr = IDirectInputDevice_Unacquire(device);
ok(hr == DI_OK, "Unacquire() failed: %08x\n", hr);
}
}
@ -121,7 +123,7 @@ struct enum_data
static BOOL CALLBACK enum_devices(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
{
struct enum_data *data = pvRef;
LPDIRECTINPUTDEVICE device;
LPDIRECTINPUTDEVICE device, obj = NULL;
HRESULT hr;
hr = IDirectInput_GetDeviceStatus(data->pDI, &lpddi->guidInstance);
@ -131,8 +133,19 @@ static BOOL CALLBACK enum_devices(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
{
hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, &device, NULL);
ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr);
trace("Testing device \"%s\"\n", lpddi->tszInstanceName);
test_object_info(device, data->hwnd);
trace("Testing device %p \"%s\"\n", device, lpddi->tszInstanceName);
hr = IUnknown_QueryInterface(device, &IID_IDirectInputDevice2A, (LPVOID*)&obj);
ok(SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDevice7A) failed: %08x\n", hr);
test_object_info(obj, data->hwnd);
if (obj) IUnknown_Release(obj);
obj = NULL;
hr = IUnknown_QueryInterface(device, &IID_IDirectInputDevice2W, (LPVOID*)&obj);
ok(SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDevice7W) failed: %08x\n", hr);
test_object_info(obj, data->hwnd);
if (obj) IUnknown_Release(obj);
IUnknown_Release(device);
}
return DIENUM_CONTINUE;
@ -141,13 +154,13 @@ static BOOL CALLBACK enum_devices(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
static void device_tests(void)
{
HRESULT hr;
LPDIRECTINPUT pDI = NULL;
LPDIRECTINPUT pDI = NULL, obj = NULL;
HINSTANCE hInstance = GetModuleHandle(NULL);
HWND hwnd;
struct enum_data data;
hr = DirectInputCreate(hInstance, DIRECTINPUT_VERSION, &pDI, NULL);
if (hr == DIERR_OLDDIRECTINPUTVERSION)
hr = CoCreateInstance(&CLSID_DirectInput, 0, 1, &IID_IDirectInput2A, (LPVOID*)&pDI);
if (hr == DIERR_OLDDIRECTINPUTVERSION || hr == DIERR_DEVICENOTREG)
{
skip("Tests require a newer dinput version\n");
return;
@ -155,6 +168,13 @@ static void device_tests(void)
ok(SUCCEEDED(hr), "DirectInputCreate() failed: %08x\n", hr);
if (FAILED(hr)) return;
hr = IDirectInput_Initialize(pDI, hInstance, DIRECTINPUT_VERSION);
ok(SUCCEEDED(hr), "Initialize() failed: %08x\n", hr);
if (FAILED(hr)) return;
hr = IUnknown_QueryInterface(pDI, &IID_IDirectInput2W, (LPVOID*)&obj);
ok(SUCCEEDED(hr), "QueryInterface(IDirectInput7W) failed: %08x\n", hr);
hwnd = CreateWindow("static", "Title", WS_OVERLAPPEDWINDOW,
10, 10, 200, 200, NULL, NULL, NULL, NULL);
ok(hwnd != NULL, "err: %d\n", GetLastError());
@ -181,6 +201,7 @@ static void device_tests(void)
DestroyWindow(hwnd);
}
if (obj) IUnknown_Release(obj);
if (pDI) IUnknown_Release(pDI);
}