static void test_DirectInputJoyConfig8(void) { IDirectInputA *pDI; IDirectInputDeviceA *pDID; IDirectInputJoyConfig8 *pDIJC; DIJOYCONFIG info; HRESULT hr; int i; hr = DirectInputCreateA(hInstance, DIRECTINPUT_VERSION, &pDI, NULL); if (FAILED(hr)) { win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr); return; } hr = IDirectInput_QueryInterface(pDI, &IID_IDirectInputJoyConfig8, (void **)&pDIJC); if (FAILED(hr)) { win_skip("Failed to instantiate a IDirectInputJoyConfig8 instance: 0x%08x\n", hr); return; } info.dwSize = sizeof(info); hr = DI_OK; i = 0; /* Enumerate all connected joystick GUIDs and try to create the respective devices */ for (i = 0; SUCCEEDED(hr); i++) { hr = IDirectInputJoyConfig8_GetConfig(pDIJC, i, &info, DIJC_GUIDINSTANCE); ok (hr == DI_OK || hr == DIERR_NOMOREITEMS, "IDirectInputJoyConfig8_GetConfig returned 0x%08x\n", hr); if (SUCCEEDED(hr)) ok (SUCCEEDED(IDirectInput_CreateDevice(pDI, &info.guidInstance, &pDID, NULL)), "IDirectInput_CreateDevice failed with guid from GetConfig hr = 0x%08x\n", hr); } IDirectInput_Release(pDI); }
static HRESULT WINAPI DI8CF_CreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj) { IClassFactoryImpl *This = impl_from_IClassFactory(iface); TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); if( IsEqualGUID( &IID_IDirectInput8A, riid ) || IsEqualGUID( &IID_IDirectInput8W, riid ) || IsEqualGUID( &IID_IUnknown, riid )) { IDirectInputA *ppDI; HRESULT hr; hr = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInputA, (void **)&ppDI); if (FAILED(hr)) return hr; hr = IDirectInput_QueryInterface(ppDI, riid, ppobj); IDirectInput_Release(ppDI); return hr; } ERR("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj); return E_NOINTERFACE; }
/****************************************************************************** * DirectInput8Create (DINPUT8.@) */ HRESULT WINAPI DECLSPEC_HOTPATCH DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riid, LPVOID *ppDI, LPUNKNOWN punkOuter) { IDirectInputA *pDI; HRESULT hr, hrCo; TRACE("hInst (%p), dwVersion: %d, riid (%s), punkOuter (%p)\n", hinst, dwVersion, debugstr_guid(riid), punkOuter); if (!ppDI) return E_POINTER; if (!IsEqualGUID(&IID_IDirectInput8A, riid) && !IsEqualGUID(&IID_IDirectInput8W, riid) && !IsEqualGUID(&IID_IUnknown, riid)) { *ppDI = NULL; return DIERR_NOINTERFACE; } hrCo = CoInitialize(NULL); hr = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInputA, (void **)&pDI); /* Ensure balance of calls. */ if (SUCCEEDED(hrCo)) CoUninitialize(); if (FAILED(hr)) { ERR("CoCreateInstance failed with hr = 0x%08x\n", hr); return hr; } hr = IDirectInput_QueryInterface(pDI, riid, ppDI); IDirectInput_Release(pDI); if (FAILED(hr)) return hr; /* When aggregation is used (punkOuter!=NULL) the application needs to manually call Initialize. */ if(punkOuter == NULL && IsEqualGUID(&IID_IDirectInput8A, riid)) { IDirectInput8A *DI = *ppDI; hr = IDirectInput8_Initialize(DI, hinst, dwVersion); if (FAILED(hr)) { IDirectInput8_Release(DI); *ppDI = NULL; return hr; } } if(punkOuter == NULL && IsEqualGUID(&IID_IDirectInput8W, riid)) { IDirectInput8W *DI = *ppDI; hr = IDirectInput8_Initialize(DI, hinst, dwVersion); if (FAILED(hr)) { IDirectInput8_Release(DI); *ppDI = NULL; return hr; } } return S_OK; }
static void test_QueryInterface(void) { static REFIID iid_list[] = {&IID_IUnknown, &IID_IDirectInputA, &IID_IDirectInputW, &IID_IDirectInput2A, &IID_IDirectInput2W, &IID_IDirectInput7A, &IID_IDirectInput7W}; static const struct { REFIID riid; int test_todo; } no_interface_list[] = { {&IID_IDirectInput8A, 1}, {&IID_IDirectInput8W, 1}, {&IID_IDirectInputDeviceA}, {&IID_IDirectInputDeviceW}, {&IID_IDirectInputDevice2A}, {&IID_IDirectInputDevice2W}, {&IID_IDirectInputDevice7A}, {&IID_IDirectInputDevice7W}, {&IID_IDirectInputDevice8A}, {&IID_IDirectInputDevice8W}, {&IID_IDirectInputEffect}, }; IDirectInputA *pDI; HRESULT hr; IUnknown *pUnk; int i; hr = DirectInputCreateA(hInstance, DIRECTINPUT_VERSION, &pDI, NULL); if (FAILED(hr)) { win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr); return; } hr = IDirectInput_QueryInterface(pDI, NULL, NULL); ok(hr == E_POINTER, "IDirectInput_QueryInterface returned 0x%08x\n", hr); pUnk = (void *)0xdeadbeef; hr = IDirectInput_QueryInterface(pDI, NULL, (void **)&pUnk); ok(hr == E_POINTER, "IDirectInput_QueryInterface returned 0x%08x\n", hr); ok(pUnk == (void *)0xdeadbeef, "Output interface pointer is %p\n", pUnk); hr = IDirectInput_QueryInterface(pDI, &IID_IUnknown, NULL); ok(hr == E_POINTER, "IDirectInput_QueryInterface returned 0x%08x\n", hr); for (i = 0; i < sizeof(iid_list)/sizeof(iid_list[0]); i++) { pUnk = NULL; hr = IDirectInput_QueryInterface(pDI, iid_list[i], (void **)&pUnk); ok(hr == S_OK, "[%d] IDirectInput_QueryInterface returned 0x%08x\n", i, hr); ok(pUnk != NULL, "[%d] Output interface pointer is NULL\n", i); if (pUnk) IUnknown_Release(pUnk); } for (i = 0; i < sizeof(no_interface_list)/sizeof(no_interface_list[0]); i++) { pUnk = (void *)0xdeadbeef; hr = IDirectInput_QueryInterface(pDI, no_interface_list[i].riid, (void **)&pUnk); if (no_interface_list[i].test_todo) { todo_wine ok(hr == E_NOINTERFACE, "[%d] IDirectInput_QueryInterface returned 0x%08x\n", i, hr); todo_wine ok(pUnk == NULL, "[%d] Output interface pointer is %p\n", i, pUnk); if (pUnk) IUnknown_Release(pUnk); } else { ok(hr == E_NOINTERFACE, "[%d] IDirectInput_QueryInterface returned 0x%08x\n", i, hr); ok(pUnk == NULL, "[%d] Output interface pointer is %p\n", i, pUnk); } } IDirectInput_Release(pDI); }