[PATCH 4/6] dinput: Prefer IDirectInputW interfaces over IDirectInputA.

Rémi Bernon rbernon at codeweavers.com
Fri May 28 04:41:29 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/dinput_main.c  | 135 ++++++++++++++++++-------------------
 dlls/dinput/tests/dinput.c |  30 ++++++++-
 2 files changed, 95 insertions(+), 70 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 7f59c16c45a..3b0de2fbde0 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -553,24 +553,24 @@ static HRESULT WINAPI IDirectInputWImpl_EnumDevices(
     return S_OK;
 }
 
-static ULONG WINAPI IDirectInputAImpl_AddRef(LPDIRECTINPUT7A iface)
+static ULONG WINAPI IDirectInputWImpl_AddRef( IDirectInput7W *iface )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE( "(%p) ref %d\n", This, ref );
     return ref;
 }
 
-static ULONG WINAPI IDirectInputWImpl_AddRef(LPDIRECTINPUT7W iface)
+static ULONG WINAPI IDirectInputAImpl_AddRef( IDirectInput7A *iface )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
-    return IDirectInputAImpl_AddRef( &This->IDirectInput7A_iface );
+    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    return IDirectInput_AddRef( &This->IDirectInput7W_iface );
 }
 
-static ULONG WINAPI IDirectInputAImpl_Release(LPDIRECTINPUT7A iface)
+static ULONG WINAPI IDirectInputWImpl_Release( IDirectInput7W *iface )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
     ULONG ref = InterlockedDecrement( &This->ref );
 
     TRACE( "(%p) ref %d\n", This, ref );
@@ -584,15 +584,15 @@ static ULONG WINAPI IDirectInputAImpl_Release(LPDIRECTINPUT7A iface)
     return ref;
 }
 
-static ULONG WINAPI IDirectInputWImpl_Release(LPDIRECTINPUT7W iface)
+static ULONG WINAPI IDirectInputAImpl_Release( IDirectInput7A *iface )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
-    return IDirectInputAImpl_Release( &This->IDirectInput7A_iface );
+    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    return IDirectInput_Release( &This->IDirectInput7W_iface );
 }
 
-static HRESULT WINAPI IDirectInputAImpl_QueryInterface(LPDIRECTINPUT7A iface, REFIID riid, LPVOID *ppobj)
+static HRESULT WINAPI IDirectInputWImpl_QueryInterface( IDirectInput7W *iface, REFIID riid, LPVOID *ppobj )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
 
     TRACE( "(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppobj );
 
@@ -602,22 +602,22 @@ static HRESULT WINAPI IDirectInputAImpl_QueryInterface(LPDIRECTINPUT7A iface, RE
     *ppobj = NULL;
 
 #if DIRECTINPUT_VERSION == 0x0700
-    if (IsEqualGUID( &IID_IUnknown, riid ) ||
-         IsEqualGUID( &IID_IDirectInputA,  riid ) ||
-         IsEqualGUID( &IID_IDirectInput2A, riid ) ||
-         IsEqualGUID( &IID_IDirectInput7A, riid ))
+    if (IsEqualGUID( &IID_IDirectInputA,  riid ) ||
+        IsEqualGUID( &IID_IDirectInput2A, riid ) ||
+        IsEqualGUID( &IID_IDirectInput7A, riid ))
         *ppobj = &This->IDirectInput7A_iface;
-    else if (IsEqualGUID( &IID_IDirectInputW,  riid ) ||
+    else if (IsEqualGUID( &IID_IUnknown, riid ) ||
+             IsEqualGUID( &IID_IDirectInputW,  riid ) ||
              IsEqualGUID( &IID_IDirectInput2W, riid ) ||
              IsEqualGUID( &IID_IDirectInput7W, riid ))
         *ppobj = &This->IDirectInput7W_iface;
 
 #else
-    if (IsEqualGUID( &IID_IUnknown, riid ) ||
-        IsEqualGUID( &IID_IDirectInput8A, riid ))
+    if (IsEqualGUID( &IID_IDirectInput8A, riid ))
         *ppobj = &This->IDirectInput8A_iface;
 
-    else if (IsEqualGUID( &IID_IDirectInput8W, riid ))
+    else if (IsEqualGUID( &IID_IUnknown, riid ) ||
+             IsEqualGUID( &IID_IDirectInput8W, riid ))
         *ppobj = &This->IDirectInput8W_iface;
 
 #endif
@@ -635,10 +635,10 @@ static HRESULT WINAPI IDirectInputAImpl_QueryInterface(LPDIRECTINPUT7A iface, RE
     return E_NOINTERFACE;
 }
 
-static HRESULT WINAPI IDirectInputWImpl_QueryInterface(LPDIRECTINPUT7W iface, REFIID riid, LPVOID *ppobj)
+static HRESULT WINAPI IDirectInputAImpl_QueryInterface( IDirectInput7A *iface, REFIID riid, LPVOID *ppobj )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
-    return IDirectInputAImpl_QueryInterface( &This->IDirectInput7A_iface, riid, ppobj );
+    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    return IDirectInput_QueryInterface( &This->IDirectInput7W_iface, riid, ppobj );
 }
 
 static LRESULT WINAPI di_em_win_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
@@ -744,9 +744,9 @@ enum directinput_versions
     DIRECTINPUT_VERSION_700 = 0x0700,
 };
 
-static HRESULT WINAPI IDirectInputAImpl_Initialize(LPDIRECTINPUT7A iface, HINSTANCE hinst, DWORD version)
+static HRESULT WINAPI IDirectInputWImpl_Initialize( IDirectInput7W *iface, HINSTANCE hinst, DWORD version )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
 
     TRACE("(%p)->(%p, 0x%04x)\n", This, hinst, version);
 
@@ -765,17 +765,17 @@ static HRESULT WINAPI IDirectInputAImpl_Initialize(LPDIRECTINPUT7A iface, HINSTA
     return initialize_directinput_instance(This, version);
 }
 
-static HRESULT WINAPI IDirectInputWImpl_Initialize(LPDIRECTINPUT7W iface, HINSTANCE hinst, DWORD x)
+static HRESULT WINAPI IDirectInputAImpl_Initialize( IDirectInput7A *iface, HINSTANCE hinst, DWORD version )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
-    return IDirectInputAImpl_Initialize( &This->IDirectInput7A_iface, hinst, x );
+    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    return IDirectInput_Initialize( &This->IDirectInput7W_iface, hinst, version );
 }
 
-static HRESULT WINAPI IDirectInputAImpl_GetDeviceStatus(LPDIRECTINPUT7A iface, REFGUID rguid)
+static HRESULT WINAPI IDirectInputWImpl_GetDeviceStatus( IDirectInput7W *iface, REFGUID rguid )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
     HRESULT hr;
-    LPDIRECTINPUTDEVICEA device;
+    IDirectInputDeviceW *device;
 
     TRACE( "(%p)->(%s)\n", This, debugstr_guid(rguid) );
 
@@ -791,22 +791,19 @@ static HRESULT WINAPI IDirectInputAImpl_GetDeviceStatus(LPDIRECTINPUT7A iface, R
     return DI_OK;
 }
 
-static HRESULT WINAPI IDirectInputWImpl_GetDeviceStatus(LPDIRECTINPUT7W iface, REFGUID rguid)
+static HRESULT WINAPI IDirectInputAImpl_GetDeviceStatus( IDirectInput7A *iface, REFGUID rguid )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
-    return IDirectInputAImpl_GetDeviceStatus( &This->IDirectInput7A_iface, rguid );
+    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    return IDirectInput_GetDeviceStatus( &This->IDirectInput7W_iface, rguid );
 }
 
-static HRESULT WINAPI IDirectInputAImpl_RunControlPanel(LPDIRECTINPUT7A iface,
-							HWND hwndOwner,
-							DWORD dwFlags)
+static HRESULT WINAPI IDirectInputWImpl_RunControlPanel( IDirectInput7W *iface, HWND hwndOwner, DWORD dwFlags )
 {
+    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
     WCHAR control_exeW[] = {'c','o','n','t','r','o','l','.','e','x','e',0};
     STARTUPINFOW si = {0};
     PROCESS_INFORMATION pi;
 
-    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
-
     TRACE( "(%p)->(%p, %08x)\n", This, hwndOwner, dwFlags );
 
     if (hwndOwner && !IsWindow(hwndOwner))
@@ -824,10 +821,10 @@ static HRESULT WINAPI IDirectInputAImpl_RunControlPanel(LPDIRECTINPUT7A iface,
     return DI_OK;
 }
 
-static HRESULT WINAPI IDirectInputWImpl_RunControlPanel(LPDIRECTINPUT7W iface, HWND hwndOwner, DWORD dwFlags)
+static HRESULT WINAPI IDirectInputAImpl_RunControlPanel( IDirectInput7A *iface, HWND hwndOwner, DWORD dwFlags )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
-    return IDirectInputAImpl_RunControlPanel( &This->IDirectInput7A_iface, hwndOwner, dwFlags );
+    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
+    return IDirectInput_RunControlPanel( &This->IDirectInput7W_iface, hwndOwner, dwFlags );
 }
 
 static HRESULT WINAPI IDirectInput2AImpl_FindDevice(LPDIRECTINPUT7A iface, REFGUID rguid,
@@ -900,13 +897,13 @@ static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, R
 static HRESULT WINAPI IDirectInputAImpl_CreateDevice(LPDIRECTINPUT7A iface, REFGUID rguid,
                                                      LPDIRECTINPUTDEVICEA* pdev, LPUNKNOWN punk)
 {
-    return IDirectInput7AImpl_CreateDeviceEx(iface, rguid, NULL, (LPVOID*)pdev, punk);
+    return IDirectInput7_CreateDeviceEx( iface, rguid, NULL, (LPVOID *)pdev, punk );
 }
 
 static HRESULT WINAPI IDirectInputWImpl_CreateDevice(LPDIRECTINPUT7W iface, REFGUID rguid,
                                                      LPDIRECTINPUTDEVICEW* pdev, LPUNKNOWN punk)
 {
-    return IDirectInput7WImpl_CreateDeviceEx(iface, rguid, NULL, (LPVOID*)pdev, punk);
+    return IDirectInput7_CreateDeviceEx( iface, rguid, NULL, (LPVOID *)pdev, punk );
 }
 
 /*******************************************************************************
@@ -916,94 +913,94 @@ static HRESULT WINAPI IDirectInputWImpl_CreateDevice(LPDIRECTINPUT7W iface, REFG
 static ULONG WINAPI IDirectInput8AImpl_AddRef(LPDIRECTINPUT8A iface)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInputAImpl_AddRef( &This->IDirectInput7A_iface );
+    return IDirectInput_AddRef( &This->IDirectInput7A_iface );
 }
 
 static ULONG WINAPI IDirectInput8WImpl_AddRef(LPDIRECTINPUT8W iface)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInputAImpl_AddRef( &This->IDirectInput7A_iface );
+    return IDirectInput_AddRef( &This->IDirectInput7W_iface );
 }
 
 static HRESULT WINAPI IDirectInput8AImpl_QueryInterface(LPDIRECTINPUT8A iface, REFIID riid, LPVOID *ppobj)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInputAImpl_QueryInterface( &This->IDirectInput7A_iface, riid, ppobj );
+    return IDirectInput_QueryInterface( &This->IDirectInput7A_iface, riid, ppobj );
 }
 
 static HRESULT WINAPI IDirectInput8WImpl_QueryInterface(LPDIRECTINPUT8W iface, REFIID riid, LPVOID *ppobj)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInputAImpl_QueryInterface( &This->IDirectInput7A_iface, riid, ppobj );
+    return IDirectInput_QueryInterface( &This->IDirectInput7W_iface, riid, ppobj );
 }
 
 static ULONG WINAPI IDirectInput8AImpl_Release(LPDIRECTINPUT8A iface)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInputAImpl_Release( &This->IDirectInput7A_iface );
+    return IDirectInput_Release( &This->IDirectInput7A_iface );
 }
 
 static ULONG WINAPI IDirectInput8WImpl_Release(LPDIRECTINPUT8W iface)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInputAImpl_Release( &This->IDirectInput7A_iface );
+    return IDirectInput_Release( &This->IDirectInput7W_iface );
 }
 
 static HRESULT WINAPI IDirectInput8AImpl_CreateDevice(LPDIRECTINPUT8A iface, REFGUID rguid,
                                                       LPDIRECTINPUTDEVICE8A* pdev, LPUNKNOWN punk)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput7AImpl_CreateDeviceEx( &This->IDirectInput7A_iface, rguid, NULL, (LPVOID*)pdev, punk );
+    return IDirectInput7_CreateDeviceEx( &This->IDirectInput7A_iface, rguid, NULL, (LPVOID *)pdev, punk );
 }
 
 static HRESULT WINAPI IDirectInput8WImpl_CreateDevice(LPDIRECTINPUT8W iface, REFGUID rguid,
                                                       LPDIRECTINPUTDEVICE8W* pdev, LPUNKNOWN punk)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInput7WImpl_CreateDeviceEx( &This->IDirectInput7W_iface, rguid, NULL, (LPVOID*)pdev, punk );
+    return IDirectInput7_CreateDeviceEx( &This->IDirectInput7W_iface, rguid, NULL, (LPVOID *)pdev, punk );
 }
 
 static HRESULT WINAPI IDirectInput8AImpl_EnumDevices(LPDIRECTINPUT8A iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback,
                                                      LPVOID pvRef, DWORD dwFlags)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInputAImpl_EnumDevices( &This->IDirectInput7A_iface, dwDevType, lpCallback, pvRef, dwFlags );
+    return IDirectInput_EnumDevices( &This->IDirectInput7A_iface, dwDevType, lpCallback, pvRef, dwFlags );
 }
 
 static HRESULT WINAPI IDirectInput8WImpl_EnumDevices(LPDIRECTINPUT8W iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback,
                                                      LPVOID pvRef, DWORD dwFlags)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInputWImpl_EnumDevices( &This->IDirectInput7W_iface, dwDevType, lpCallback, pvRef, dwFlags );
+    return IDirectInput_EnumDevices( &This->IDirectInput7W_iface, dwDevType, lpCallback, pvRef, dwFlags );
 }
 
 static HRESULT WINAPI IDirectInput8AImpl_GetDeviceStatus(LPDIRECTINPUT8A iface, REFGUID rguid)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInputAImpl_GetDeviceStatus( &This->IDirectInput7A_iface, rguid );
+    return IDirectInput_GetDeviceStatus( &This->IDirectInput7A_iface, rguid );
 }
 
 static HRESULT WINAPI IDirectInput8WImpl_GetDeviceStatus(LPDIRECTINPUT8W iface, REFGUID rguid)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInputAImpl_GetDeviceStatus( &This->IDirectInput7A_iface, rguid );
+    return IDirectInput_GetDeviceStatus( &This->IDirectInput7W_iface, rguid );
 }
 
 static HRESULT WINAPI IDirectInput8AImpl_RunControlPanel(LPDIRECTINPUT8A iface, HWND hwndOwner, DWORD dwFlags)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInputAImpl_RunControlPanel( &This->IDirectInput7A_iface, hwndOwner, dwFlags );
+    return IDirectInput_RunControlPanel( &This->IDirectInput7A_iface, hwndOwner, dwFlags );
 }
 
 static HRESULT WINAPI IDirectInput8WImpl_RunControlPanel(LPDIRECTINPUT8W iface, HWND hwndOwner, DWORD dwFlags)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInputAImpl_RunControlPanel( &This->IDirectInput7A_iface, hwndOwner, dwFlags );
+    return IDirectInput_RunControlPanel( &This->IDirectInput7W_iface, hwndOwner, dwFlags );
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_Initialize(LPDIRECTINPUT8A iface, HINSTANCE hinst, DWORD version)
+static HRESULT WINAPI IDirectInput8WImpl_Initialize( IDirectInput8W *iface, HINSTANCE hinst, DWORD version )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
+    IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
 
     TRACE("(%p)->(%p, 0x%04x)\n", This, hinst, version);
 
@@ -1019,22 +1016,22 @@ static HRESULT WINAPI IDirectInput8AImpl_Initialize(LPDIRECTINPUT8A iface, HINST
     return initialize_directinput_instance(This, version);
 }
 
-static HRESULT WINAPI IDirectInput8WImpl_Initialize(LPDIRECTINPUT8W iface, HINSTANCE hinst, DWORD version)
+static HRESULT WINAPI IDirectInput8AImpl_Initialize( IDirectInput8A *iface, HINSTANCE hinst, DWORD version )
 {
-    IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInput8AImpl_Initialize( &This->IDirectInput8A_iface, hinst, version );
+    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
+    return IDirectInput8_Initialize( &This->IDirectInput8W_iface, hinst, version );
 }
 
 static HRESULT WINAPI IDirectInput8AImpl_FindDevice(LPDIRECTINPUT8A iface, REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput2AImpl_FindDevice( &This->IDirectInput7A_iface, rguid, pszName, pguidInstance );
+    return IDirectInput2_FindDevice( &This->IDirectInput7A_iface, rguid, pszName, pguidInstance );
 }
 
 static HRESULT WINAPI IDirectInput8WImpl_FindDevice(LPDIRECTINPUT8W iface, REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
-    return IDirectInput2WImpl_FindDevice( &This->IDirectInput7W_iface, rguid, pszName, pguidInstance );
+    return IDirectInput2_FindDevice( &This->IDirectInput7W_iface, rguid, pszName, pguidInstance );
 }
 
 static BOOL should_enumerate_device(const WCHAR *username, DWORD dwFlags,
@@ -1340,7 +1337,7 @@ static HRESULT WINAPI IDirectInput8AImpl_ConfigureDevices(
         diafW.rgoAction[i].u.lptszActionName = to;
     }
 
-    hr = IDirectInput8WImpl_ConfigureDevices(&This->IDirectInput8W_iface, lpdiCallback, &diCDParamsW, dwFlags, pvRefData);
+    hr = IDirectInput8_ConfigureDevices( &This->IDirectInput8W_iface, lpdiCallback, &diCDParamsW, dwFlags, pvRefData );
 
     /* Copy back configuration */
     if (SUCCEEDED(hr))
@@ -1367,19 +1364,19 @@ static inline IDirectInputImpl *impl_from_IDirectInputJoyConfig8(IDirectInputJoy
 static HRESULT WINAPI JoyConfig8Impl_QueryInterface(IDirectInputJoyConfig8 *iface, REFIID riid, void** ppobj)
 {
     IDirectInputImpl *This = impl_from_IDirectInputJoyConfig8( iface );
-    return IDirectInputAImpl_QueryInterface( &This->IDirectInput7A_iface, riid, ppobj );
+    return IDirectInput_QueryInterface( &This->IDirectInput7W_iface, riid, ppobj );
 }
 
 static ULONG WINAPI JoyConfig8Impl_AddRef(IDirectInputJoyConfig8 *iface)
 {
     IDirectInputImpl *This = impl_from_IDirectInputJoyConfig8( iface );
-    return IDirectInputAImpl_AddRef( &This->IDirectInput7A_iface );
+    return IDirectInput_AddRef( &This->IDirectInput7W_iface );
 }
 
 static ULONG WINAPI JoyConfig8Impl_Release(IDirectInputJoyConfig8 *iface)
 {
     IDirectInputImpl *This = impl_from_IDirectInputJoyConfig8( iface );
-    return IDirectInputAImpl_Release( &This->IDirectInput7A_iface );
+    return IDirectInput_Release( &This->IDirectInput7W_iface );
 }
 
 static HRESULT WINAPI JoyConfig8Impl_Acquire(IDirectInputJoyConfig8 *iface)
diff --git a/dlls/dinput/tests/dinput.c b/dlls/dinput/tests/dinput.c
index 5947b17468b..c7fa0b76397 100644
--- a/dlls/dinput/tests/dinput.c
+++ b/dlls/dinput/tests/dinput.c
@@ -286,7 +286,7 @@ static void test_QueryInterface(void)
 
     IDirectInputA *pDI;
     HRESULT hr;
-    IUnknown *pUnk;
+    IUnknown *pUnk, *iface, *tmp_iface;
     int i;
 
     hr = DirectInputCreateA(hInstance, DIRECTINPUT_VERSION, &pDI, NULL);
@@ -324,6 +324,34 @@ static void test_QueryInterface(void)
         ok(pUnk == NULL, "[%d] Output interface pointer is %p\n", i, pUnk);
     }
 
+    hr = IUnknown_QueryInterface( pDI, &IID_IDirectInputA, (void **)&iface );
+    ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputA) failed: %08x\n", hr );
+    hr = IUnknown_QueryInterface( pDI, &IID_IDirectInput2A, (void **)&tmp_iface );
+    ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInput2A) failed: %08x\n", hr );
+    ok( tmp_iface == iface, "IID_IDirectInput2A iface differs from IID_IDirectInputA\n" );
+    IUnknown_Release( tmp_iface );
+    hr = IUnknown_QueryInterface( pDI, &IID_IDirectInput7A, (void **)&tmp_iface );
+    ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInput7A) failed: %08x\n", hr );
+    ok( tmp_iface == iface, "IID_IDirectInput7A iface differs from IID_IDirectInputA\n" );
+    IUnknown_Release( tmp_iface );
+    IUnknown_Release( iface );
+
+    hr = IUnknown_QueryInterface( pDI, &IID_IUnknown, (void **)&iface );
+    ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IUnknown) failed: %08x\n", hr );
+    hr = IUnknown_QueryInterface( pDI, &IID_IDirectInputW, (void **)&tmp_iface );
+    ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputW) failed: %08x\n", hr );
+    ok( tmp_iface == iface, "IID_IDirectInputW iface differs from IID_IUnknown\n" );
+    IUnknown_Release( tmp_iface );
+    hr = IUnknown_QueryInterface( pDI, &IID_IDirectInput2W, (void **)&tmp_iface );
+    ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInput2W) failed: %08x\n", hr );
+    ok( tmp_iface == iface, "IID_IDirectInput2W iface differs from IID_IUnknown\n" );
+    IUnknown_Release( tmp_iface );
+    hr = IUnknown_QueryInterface( pDI, &IID_IDirectInput7W, (void **)&tmp_iface );
+    ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInput7W) failed: %08x\n", hr );
+    ok( tmp_iface == iface, "IID_IDirectInput7W iface differs from IID_IUnknown\n" );
+    IUnknown_Release( tmp_iface );
+    IUnknown_Release( iface );
+
     IDirectInput_Release(pDI);
 }
 
-- 
2.31.0




More information about the wine-devel mailing list