Andrew Nguyen : dinput: Fix some return values of IDirectInput:: QueryInterface.
Alexandre Julliard
julliard at winehq.org
Wed Jul 6 13:31:04 CDT 2011
Module: wine
Branch: master
Commit: c28512a5a64b249ff7e7a02ff0c986dd3707276d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c28512a5a64b249ff7e7a02ff0c986dd3707276d
Author: Andrew Nguyen <anguyen at codeweavers.com>
Date: Tue Jul 5 07:18:52 2011 -0500
dinput: Fix some return values of IDirectInput::QueryInterface.
---
dlls/dinput/dinput_main.c | 6 +++-
dlls/dinput/tests/device.c | 1 -
dlls/dinput/tests/dinput.c | 82 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 87 insertions(+), 2 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 3493bdd..865da02 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -421,6 +421,9 @@ static HRESULT WINAPI IDirectInputAImpl_QueryInterface(LPDIRECTINPUT7A iface, RE
TRACE( "(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppobj );
+ if (!riid || !ppobj)
+ return E_POINTER;
+
if (IsEqualGUID( &IID_IUnknown, riid ) ||
IsEqualGUID( &IID_IDirectInputA, riid ) ||
IsEqualGUID( &IID_IDirectInput2A, riid ) ||
@@ -459,7 +462,8 @@ static HRESULT WINAPI IDirectInputAImpl_QueryInterface(LPDIRECTINPUT7A iface, RE
}
FIXME( "Unsupported interface: %s\n", debugstr_guid(riid));
- return E_FAIL;
+ *ppobj = NULL;
+ return E_NOINTERFACE;
}
static HRESULT WINAPI IDirectInputWImpl_QueryInterface(LPDIRECTINPUT7W iface, REFIID riid, LPVOID *ppobj)
diff --git a/dlls/dinput/tests/device.c b/dlls/dinput/tests/device.c
index a8ff19b..ea25482 100644
--- a/dlls/dinput/tests/device.c
+++ b/dlls/dinput/tests/device.c
@@ -23,7 +23,6 @@
#include "wine/test.h"
#include "windef.h"
-#include "initguid.h"
#include "dinput.h"
static const DIOBJECTDATAFORMAT obj_data_format[] = {
diff --git a/dlls/dinput/tests/dinput.c b/dlls/dinput/tests/dinput.c
index 71ed4f6..7b25b8a 100644
--- a/dlls/dinput/tests/dinput.c
+++ b/dlls/dinput/tests/dinput.c
@@ -19,6 +19,7 @@
#define DIRECTINPUT_VERSION 0x0700
#define COBJMACROS
+#include <initguid.h>
#include <windows.h>
#include <dinput.h>
@@ -26,6 +27,86 @@
HINSTANCE hInstance;
+static void test_QueryInterface(void)
+{
+ static const 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);
+}
+
static void test_RunControlPanel(void)
{
IDirectInputA *pDI;
@@ -64,6 +145,7 @@ START_TEST(dinput)
hInstance = GetModuleHandleA(NULL);
CoInitialize(NULL);
+ test_QueryInterface();
test_RunControlPanel();
CoUninitialize();
}
More information about the wine-cvs
mailing list