James Hawkins : oleaut32: Report the parameter index for any failure in DispGetParam.

Alexandre Julliard julliard at winehq.org
Mon Dec 7 10:26:11 CST 2009


Module: wine
Branch: master
Commit: 89b2cde891e6316cd1bef7c4c28396a575f4aced
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=89b2cde891e6316cd1bef7c4c28396a575f4aced

Author: James Hawkins <truiken at gmail.com>
Date:   Fri Dec  4 17:15:11 2009 -0800

oleaut32: Report the parameter index for any failure in DispGetParam.

---

 dlls/oleaut32/dispatch.c       |   36 +++++++++++++++++++++++++-----------
 dlls/oleaut32/tests/dispatch.c |   27 ++++++---------------------
 2 files changed, 31 insertions(+), 32 deletions(-)

diff --git a/dlls/oleaut32/dispatch.c b/dlls/oleaut32/dispatch.c
index 5d96bfb..ed3fad4 100644
--- a/dlls/oleaut32/dispatch.c
+++ b/dlls/oleaut32/dispatch.c
@@ -131,16 +131,13 @@ HRESULT WINAPI DispGetParam(
     TRACE("position=%d, cArgs=%d, cNamedArgs=%d\n",
           position, pdispparams->cArgs, pdispparams->cNamedArgs);
 
-    if (pdispparams->cArgs > 0 && !pdispparams->rgvarg)
-        return E_INVALIDARG;
-
-    if (!pvarResult)
-        return E_INVALIDARG;
-
-    if (position < pdispparams->cArgs) {
+    if (position < pdispparams->cArgs)
+    {
       /* positional arg? */
       pos = pdispparams->cArgs - position - 1;
-    } else {
+    }
+    else
+    {
       /* FIXME: is this how to handle named args? */
       for (pos=0; pos<pdispparams->cNamedArgs; pos++)
         if (pdispparams->rgdispidNamedArgs[pos] == position) break;
@@ -148,10 +145,27 @@ HRESULT WINAPI DispGetParam(
       if (pos==pdispparams->cNamedArgs)
         return DISP_E_PARAMNOTFOUND;
     }
+
+    if (pdispparams->cArgs > 0 && !pdispparams->rgvarg)
+    {
+        hr = E_INVALIDARG;
+        goto done;
+    }
+
+    if (!pvarResult)
+    {
+        hr = E_INVALIDARG;
+        goto done;
+    }
+
     hr = VariantChangeType(pvarResult,
                            &pdispparams->rgvarg[pos],
                            0, vtTarg);
-    if (hr == DISP_E_TYPEMISMATCH) *puArgErr = pos;
+
+done:
+    if (FAILED(hr))
+        *puArgErr = pos;
+
     return hr;
 }
 
@@ -241,8 +255,8 @@ static HRESULT WINAPI StdDispatch_QueryInterface(
         IsEqualIID(riid, &IID_IUnknown))
     {
         *ppvObject = This;
-	IUnknown_AddRef((LPUNKNOWN)*ppvObject);
-	return S_OK;
+        IUnknown_AddRef((LPUNKNOWN)*ppvObject);
+        return S_OK;
     }
     return E_NOINTERFACE;
 }
diff --git a/dlls/oleaut32/tests/dispatch.c b/dlls/oleaut32/tests/dispatch.c
index fb1e310..c81210f 100644
--- a/dlls/oleaut32/tests/dispatch.c
+++ b/dlls/oleaut32/tests/dispatch.c
@@ -103,11 +103,8 @@ void test_DispGetParam(void)
     INIT_DISPPARAMS(dispparams, NULL, NULL, 0, 0);
     err_index = 0xdeadbeef;
     hr = DispGetParam(&dispparams, 0, VT_I2, NULL, &err_index);
-    todo_wine
-    {
-        ok(hr == DISP_E_PARAMNOTFOUND,
-           "Expected DISP_E_PARAMNOTFOUND, got %08x\n", hr);
-    }
+    ok(hr == DISP_E_PARAMNOTFOUND,
+       "Expected DISP_E_PARAMNOTFOUND, got %08x\n", hr);
     ok(err_index == 0xdeadbeef,
        "Expected err_index to be unchanged, got %d\n", err_index);
 
@@ -128,10 +125,7 @@ void test_DispGetParam(void)
     ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
     ok(V_VT(&result) == VT_EMPTY,
        "Expected VT_EMPTY, got %08x\n", V_VT(&result));
-    todo_wine
-    {
-        ok(err_index == 0, "Expected 0, got %d\n", err_index);
-    }
+    ok(err_index == 0, "Expected 0, got %d\n", err_index);
 
     /* pdispparams.cNamedArgs is 1, yet pdispparams.rgdispidNamedArgs is NULL.
      *
@@ -195,10 +189,7 @@ void test_DispGetParam(void)
     err_index = 0xdeadbeef;
     hr = DispGetParam(&dispparams, 2, VT_I2, NULL, &err_index);
     ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
-    todo_wine
-    {
-        ok(err_index == 0, "Expected 0, got %d\n", err_index);
-    }
+    ok(err_index == 0, "Expected 0, got %d\n", err_index);
 
     /* puArgErr is NULL. */
     INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
@@ -239,10 +230,7 @@ void test_DispGetParam(void)
     ok(hr == DISP_E_OVERFLOW, "Expected DISP_E_OVERFLOW, got %08x\n", hr);
     ok(V_VT(&result) == VT_EMPTY,
        "Expected VT_EMPTY, got %08x\n", V_VT(&result));
-    todo_wine
-    {
-        ok(err_index == 1, "Expected 1, got %d\n", err_index);
-    }
+    ok(err_index == 1, "Expected 1, got %d\n", err_index);
 
     /* Coerce the third (VT_BSTR) param to VT_I2. */
     INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
@@ -263,10 +251,7 @@ void test_DispGetParam(void)
     ok(hr == DISP_E_BADVARTYPE, "Expected DISP_E_BADVARTYPE, got %08x\n", hr);
     ok(V_VT(&result) == VT_EMPTY,
        "Expected VT_EMPTY, got %08x\n", V_VT(&result));
-    todo_wine
-    {
-        ok(err_index == 0, "Expected 0, got %d\n", err_index);
-    }
+    ok(err_index == 0, "Expected 0, got %d\n", err_index);
 
     CLEAR_VARARG(vararg);
 




More information about the wine-cvs mailing list