qbool IN_InitDInput (void) { #if DIRECTINPUT_VERSION >= 0x0700 HRESULT hr; DIPROPDWORD dipdw = { { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_DEVICE, // diph.dwHow }, DI_BufSize(), // dwData }; DIDATAFORMAT qdf = { sizeof(DIDATAFORMAT), // this structure sizeof(DIOBJECTDATAFORMAT), // size of object data format DIDF_RELAXIS, // absolute axis coordinates sizeof(MYDATA), // device data size sizeof(rgodf)/sizeof(rgodf[0]), // number of objects rgodf // and here they are }; if (!hInstDI) { hInstDI = LoadLibrary("dinput.dll"); if (hInstDI == NULL) { Com_Printf_State(PRINT_FAIL, "Couldn't load dinput.dll\n"); return false; } } if (!pDirectInputCreateEx) { pDirectInputCreateEx = (void *)GetProcAddress(hInstDI,"DirectInputCreateEx"); if (!pDirectInputCreateEx) { Com_Printf_State(PRINT_FAIL, "Couldn't get DI proc addr\n"); return false; } } // register with DirectInput and get an IDirectInput to play with. hr = pDirectInputCreateEx(global_hInstance, DIRECTINPUT_VERSION, &IID_IDirectInput7, (LPVOID *) &g_pdi, NULL); if (FAILED(hr)) return false; // obtain an interface to the system mouse device. hr = IDirectInput7_CreateDeviceEx(g_pdi, &GUID_SysMouse, &IID_IDirectInputDevice7, (LPVOID *) &g_pMouse, NULL); if (FAILED(hr)) { Com_Printf_State(PRINT_FAIL, "Couldn't open DI mouse device\n"); return false; } // set the data format to "mouse format". hr = IDirectInputDevice7_SetDataFormat(g_pMouse, &qdf); if (FAILED(hr)) { Com_Printf_State(PRINT_FAIL, "Couldn't set DI mouse format\n"); return false; } // set the cooperativity level. hr = IDirectInputDevice7_SetCooperativeLevel(g_pMouse, mainwindow, DISCL_EXCLUSIVE | DISCL_FOREGROUND); if (FAILED(hr)) { Com_Printf_State(PRINT_FAIL, "Couldn't set DI coop level\n"); return false; } // set the buffer size to DI_BufSize() elements. // the buffer size is a DWORD property associated with the device if (in_di_buffered.integer) { hr = IDirectInputDevice7_SetProperty(g_pMouse, DIPROP_BUFFERSIZE, &dipdw.diph); if (FAILED(hr)) { Com_Printf_State(PRINT_FAIL, "Couldn't set DI buffersize\n"); return false; } } else { // no properties for immediate input } IN_SMouseInit(); return true; #else // DIRECTINPUT_VERSION >= 0x0700 return false; #endif // DIRECTINPUT_VERSION >= 0x0700 else }
static void test_DirectInputCreateEx(void) { static const struct { BOOL hinst; DWORD dwVersion; REFIID riid; BOOL ppdi; HRESULT expected_hr; IUnknown *expected_ppdi; } invalid_param_list[] = { {FALSE, 0, &IID_IUnknown, FALSE, DIERR_NOINTERFACE}, {FALSE, 0, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef}, {FALSE, 0, &IID_IDirectInputA, FALSE, E_POINTER}, {FALSE, 0, &IID_IDirectInputA, TRUE, DIERR_INVALIDPARAM, NULL}, {FALSE, DIRECTINPUT_VERSION, &IID_IUnknown, FALSE, DIERR_NOINTERFACE}, {FALSE, DIRECTINPUT_VERSION, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef}, {FALSE, DIRECTINPUT_VERSION, &IID_IDirectInputA, FALSE, E_POINTER}, {FALSE, DIRECTINPUT_VERSION, &IID_IDirectInputA, TRUE, DIERR_INVALIDPARAM, NULL}, {FALSE, DIRECTINPUT_VERSION - 1, &IID_IUnknown, FALSE, DIERR_NOINTERFACE}, {FALSE, DIRECTINPUT_VERSION - 1, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef}, {FALSE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA, FALSE, E_POINTER}, {FALSE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA, TRUE, DIERR_INVALIDPARAM, NULL}, {FALSE, DIRECTINPUT_VERSION + 1, &IID_IUnknown, FALSE, DIERR_NOINTERFACE}, {FALSE, DIRECTINPUT_VERSION + 1, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef}, {FALSE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA, FALSE, E_POINTER}, {FALSE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA, TRUE, DIERR_INVALIDPARAM, NULL}, {TRUE, 0, &IID_IUnknown, FALSE, DIERR_NOINTERFACE}, {TRUE, 0, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef}, {TRUE, 0, &IID_IDirectInputA, FALSE, E_POINTER}, {TRUE, 0, &IID_IDirectInputA, TRUE, DIERR_NOTINITIALIZED, NULL}, {TRUE, DIRECTINPUT_VERSION, &IID_IUnknown, FALSE, DIERR_NOINTERFACE}, {TRUE, DIRECTINPUT_VERSION, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef}, {TRUE, DIRECTINPUT_VERSION, &IID_IDirectInputA, FALSE, E_POINTER}, {TRUE, DIRECTINPUT_VERSION - 1, &IID_IUnknown, FALSE, DIERR_NOINTERFACE}, {TRUE, DIRECTINPUT_VERSION - 1, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef}, {TRUE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA, FALSE, E_POINTER}, {TRUE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA, TRUE, DIERR_BETADIRECTINPUTVERSION, NULL}, {TRUE, DIRECTINPUT_VERSION + 1, &IID_IUnknown, FALSE, DIERR_NOINTERFACE}, {TRUE, DIRECTINPUT_VERSION + 1, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef}, {TRUE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA, FALSE, E_POINTER}, {TRUE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA, TRUE, DIERR_OLDDIRECTINPUTVERSION, NULL}, }; static REFIID no_interface_list[] = {&IID_IUnknown, &IID_IDirectInput8A, &IID_IDirectInput8W, &IID_IDirectInputDeviceA, &IID_IDirectInputDeviceW, &IID_IDirectInputDevice2A, &IID_IDirectInputDevice2W, &IID_IDirectInputDevice7A, &IID_IDirectInputDevice7W, &IID_IDirectInputDevice8A, &IID_IDirectInputDevice8W, &IID_IDirectInputEffect}; static REFIID iid_list[] = {&IID_IDirectInputA, &IID_IDirectInputW, &IID_IDirectInput2A, &IID_IDirectInput2W, &IID_IDirectInput7A, &IID_IDirectInput7W}; int i, j; IUnknown *pUnk; HRESULT hr; if (!pDirectInputCreateEx) { win_skip("DirectInputCreateEx is not available\n"); return; } for (i = 0; i < sizeof(invalid_param_list)/sizeof(invalid_param_list[0]); i++) { if (invalid_param_list[i].ppdi) pUnk = (void *)0xdeadbeef; hr = pDirectInputCreateEx(invalid_param_list[i].hinst ? hInstance : NULL, invalid_param_list[i].dwVersion, invalid_param_list[i].riid, invalid_param_list[i].ppdi ? (void **)&pUnk : NULL, NULL); ok(hr == invalid_param_list[i].expected_hr, "[%d] DirectInputCreateEx returned 0x%08x\n", i, hr); if (invalid_param_list[i].ppdi) ok(pUnk == invalid_param_list[i].expected_ppdi, "[%d] Output interface pointer is %p\n", i, pUnk); } for (i = 0; i < sizeof(no_interface_list)/sizeof(no_interface_list[0]); i++) { pUnk = (void *)0xdeadbeef; hr = pDirectInputCreateEx(hInstance, DIRECTINPUT_VERSION, no_interface_list[i], (void **)&pUnk, NULL); ok(hr == DIERR_NOINTERFACE, "[%d] DirectInputCreateEx returned 0x%08x\n", i, hr); ok(pUnk == (void *)0xdeadbeef, "[%d] Output interface pointer is %p\n", i, pUnk); } for (i = 0; i < sizeof(iid_list)/sizeof(iid_list[0]); i++) { pUnk = NULL; hr = pDirectInputCreateEx(hInstance, DIRECTINPUT_VERSION, iid_list[i], (void **)&pUnk, NULL); ok(hr == DI_OK, "[%d] DirectInputCreateEx returned 0x%08x\n", i, hr); ok(pUnk != NULL, "[%d] Output interface pointer is NULL\n", i); if (pUnk) IUnknown_Release(pUnk); } /* Examine combinations of requested interfaces and version numbers. */ for (i = 0; i < sizeof(directinput_version_list)/sizeof(directinput_version_list[0]); i++) { for (j = 0; j < sizeof(iid_list)/sizeof(iid_list[0]); j++) { pUnk = NULL; hr = pDirectInputCreateEx(hInstance, directinput_version_list[i], iid_list[j], (void **)&pUnk, NULL); ok(hr == DI_OK, "[%d/%d] DirectInputCreateEx returned 0x%08x\n", i, j, hr); ok(pUnk != NULL, "[%d] Output interface pointer is NULL\n", i); if (pUnk) IUnknown_Release(pUnk); } } }