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