static HRESULT WINAPI ExternalConnection_QueryInterface(IExternalConnection *iface, REFIID riid, void **ppv)
{
- ok(0, "unxpected call\n");
+ ok(0, "unexpected call\n");
*ppv = NULL;
return E_NOINTERFACE;
}
ApplicationObject2 **ppVal)
{
trace("CloneCoclass()\n");
- return S_OK;
+ return Widget_QueryInterface(iface, &IID_IWidget, (void **)ppVal);
}
static HRESULT WINAPI Widget_Value(
return S_OK;
}
-static HRESULT WINAPI Widget__restrict(IWidget* iface, INT *i)
+static HRESULT WINAPI Widget_pos_restrict(IWidget* iface, INT *i)
{
trace("restrict\n");
*i = DISPID_TM_RESTRICTED;
return S_OK;
}
+static HRESULT WINAPI Widget_VarArg_Run(
+ IWidget *iface, BSTR name, SAFEARRAY *params, VARIANT *result)
+{
+ static const WCHAR catW[] = { 'C','a','t',0 };
+ static const WCHAR supermanW[] = { 'S','u','p','e','r','m','a','n',0 };
+ LONG bound;
+ VARIANT *var;
+ BSTR bstr;
+ HRESULT hr;
+
+ trace("VarArg_Run(%p,%p,%p)\n", name, params, result);
+
+ ok(!lstrcmpW(name, catW), "got %s\n", wine_dbgstr_w(name));
+
+ hr = SafeArrayGetLBound(params, 1, &bound);
+ ok(hr == S_OK, "SafeArrayGetLBound error %#x\n", hr);
+ ok(bound == 0, "expected 0, got %d\n", bound);
+
+ hr = SafeArrayGetUBound(params, 1, &bound);
+ ok(hr == S_OK, "SafeArrayGetUBound error %#x\n", hr);
+ ok(bound == 0, "expected 0, got %d\n", bound);
+
+ hr = SafeArrayAccessData(params, (void **)&var);
+ ok(hr == S_OK, "SafeArrayAccessData failed with %x\n", hr);
+
+ ok(V_VT(&var[0]) == VT_BSTR, "expected VT_BSTR, got %d\n", V_VT(&var[0]));
+ bstr = V_BSTR(&var[0]);
+ ok(!lstrcmpW(bstr, supermanW), "got %s\n", wine_dbgstr_w(bstr));
+
+ hr = SafeArrayUnaccessData(params);
+ ok(hr == S_OK, "SafeArrayUnaccessData error %#x\n", hr);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI Widget_VarArg_Ref_Run(
+ IWidget *iface, BSTR name, SAFEARRAY **params, VARIANT *result)
+{
+ static const WCHAR catW[] = { 'C','a','t',0 };
+ static const WCHAR supermanW[] = { 'S','u','p','e','r','m','a','n',0 };
+ LONG bound;
+ VARIANT *var;
+ BSTR bstr;
+ HRESULT hr;
+
+ trace("VarArg_Ref_Run(%p,%p,%p)\n", name, params, result);
+
+ ok(!lstrcmpW(name, catW), "got %s\n", wine_dbgstr_w(name));
+
+ hr = SafeArrayGetLBound(*params, 1, &bound);
+ ok(hr == S_OK, "SafeArrayGetLBound error %#x\n", hr);
+ ok(bound == 0, "expected 0, got %d\n", bound);
+
+ hr = SafeArrayGetUBound(*params, 1, &bound);
+ ok(hr == S_OK, "SafeArrayGetUBound error %#x\n", hr);
+ ok(bound == 0, "expected 0, got %d\n", bound);
+
+ hr = SafeArrayAccessData(*params, (void **)&var);
+ ok(hr == S_OK, "SafeArrayAccessData error %#x\n", hr);
+
+ ok(V_VT(&var[0]) == VT_BSTR, "expected VT_BSTR, got %d\n", V_VT(&var[0]));
+ bstr = V_BSTR(&var[0]);
+ ok(!lstrcmpW(bstr, supermanW), "got %s\n", wine_dbgstr_w(bstr));
+
+ hr = SafeArrayUnaccessData(*params);
+ ok(hr == S_OK, "SafeArrayUnaccessData error %#x\n", hr);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI Widget_Coclass(
+ IWidget *iface,
+ ApplicationObject2 *p)
+{
+ trace("Coclass(%p)\n", p);
+ ok(p == (ApplicationObject2 *)iface, "expected p == %p, got %p\n", iface, p);
+ return S_OK;
+}
+
static const struct IWidgetVtbl Widget_VTable =
{
Widget_QueryInterface,
Widget_ByRefUInt,
Widget_put_prop_opt_arg,
Widget_put_prop_req_arg,
- Widget__restrict,
- Widget_neg_restrict
+ Widget_pos_restrict,
+ Widget_neg_restrict,
+ Widget_VarArg_Run,
+ Widget_VarArg_Ref_Run,
+ Widget_Coclass,
};
static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject)
excepinfo.wCode, excepinfo.scode);
ok(V_VT(&varresult) == VT_DISPATCH, "V_VT(&varresult) was %d instead of VT_DISPATCH\n", V_VT(&varresult));
- ok(!V_DISPATCH(&varresult), "V_DISPATCH(&varresult) should be NULL instead of %p\n", V_DISPATCH(&varresult));
+ ok(V_DISPATCH(&varresult) != NULL, "expected V_DISPATCH(&varresult) != NULL\n");
+
+ /* call CoClass with VT_DISPATCH type */
+ vararg[0] = varresult;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = vararg;
+ VariantInit(&varresult);
+ hr = IDispatch_Invoke(pDispatch, DISPID_TM_COCLASS, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
+ ok_ole_success(hr, IDispatch_Invoke);
+ ok(excepinfo.wCode == 0x0 && excepinfo.scode == S_OK,
+ "EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
+ excepinfo.wCode, excepinfo.scode);
VariantClear(&varresult);
+ /* call CoClass (direct) */
+ hr = IWidget_Coclass(pWidget, (void *)V_DISPATCH(&vararg[0]));
+ ok_ole_success(hr, IWidget_Coclass);
+ VariantClear(&vararg[0]);
+
/* call Value with a VT_VARIANT|VT_BYREF type */
V_VT(&vararg[0]) = VT_VARIANT|VT_BYREF;
V_VARIANTREF(&vararg[0]) = &vararg[1];
ok_ole_success(hr, IDispatch_Invoke);
VariantClear(&varresult);
+ /* call Array with BSTR argument - type mismatch */
+ VariantInit(&vararg[0]);
+ V_VT(&vararg[0]) = VT_BSTR;
+ V_BSTR(&vararg[0]) = SysAllocString(szSuperman);
+ dispparams.cNamedArgs = 0;
+ dispparams.cArgs = 1;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.rgvarg = vararg;
+ hr = IDispatch_Invoke(pDispatch, DISPID_TM_ARRAY, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
+ ok(hr == DISP_E_TYPEMISMATCH || hr == DISP_E_BADVARTYPE, "expected DISP_E_TYPEMISMATCH, got %#x\n", hr);
+ SysFreeString(V_BSTR(&vararg[0]));
+
+ /* call ArrayPtr with BSTR argument - type mismatch */
+ VariantInit(&vararg[0]);
+ V_VT(&vararg[0]) = VT_BSTR;
+ V_BSTR(&vararg[0]) = SysAllocString(szSuperman);
+ dispparams.cNamedArgs = 0;
+ dispparams.cArgs = 1;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.rgvarg = vararg;
+ hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARRAYPTR, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
+ ok(hr == DISP_E_TYPEMISMATCH || hr == DISP_E_BADVARTYPE, "expected DISP_E_TYPEMISMATCH, got %#x\n", hr);
+ SysFreeString(V_BSTR(&vararg[0]));
+
/* call VariantCArray - test marshaling of variant arrays */
V_VT(&vararg[0]) = VT_I4;
V_I4(&vararg[0]) = 1;
dispparams.rgdispidNamedArgs = NULL;
dispparams.rgvarg = vararg;
hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
- ok_ole_success(hr, ITypeInfo_Invoke);
+ ok_ole_success(hr, IDispatch_Invoke);
/* call VarArg, even one (non-optional, non-safearray) named argument is not allowed */
dispidNamed = 0;
ok(hr == DISP_E_NONAMEDARGS, "IDispatch_Invoke should have returned DISP_E_NONAMEDARGS instead of 0x%08x\n", hr);
dispidNamed = DISPID_PROPERTYPUT;
+ /* call VarArg_Run */
+ VariantInit(&vararg[1]);
+ V_VT(&vararg[1]) = VT_BSTR;
+ V_BSTR(&vararg[1]) = SysAllocString(szCat);
+ VariantInit(&vararg[0]);
+ V_VT(&vararg[0]) = VT_BSTR;
+ V_BSTR(&vararg[0]) = SysAllocString(szSuperman);
+ dispparams.cNamedArgs = 0;
+ dispparams.cArgs = 2;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.rgvarg = vararg;
+ hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG_RUN, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
+ ok_ole_success(hr, IDispatch_Invoke);
+ SysFreeString(V_BSTR(&vararg[1]));
+ SysFreeString(V_BSTR(&vararg[0]));
+
+ /* call VarArg_Ref_Run */
+ VariantInit(&vararg[1]);
+ V_VT(&vararg[1]) = VT_BSTR;
+ V_BSTR(&vararg[1]) = SysAllocString(szCat);
+ VariantInit(&vararg[0]);
+ V_VT(&vararg[0]) = VT_BSTR;
+ V_BSTR(&vararg[0]) = SysAllocString(szSuperman);
+ dispparams.cNamedArgs = 0;
+ dispparams.cArgs = 2;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.rgvarg = vararg;
+ hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG_REF_RUN, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
+ ok_ole_success(hr, IDispatch_Invoke);
+ SysFreeString(V_BSTR(&vararg[1]));
+ SysFreeString(V_BSTR(&vararg[0]));
+
/* call Error */
dispparams.cNamedArgs = 0;
dispparams.cArgs = 0;
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
+ IStream_Release(stream);
+ IStream_Release(stream2);
+
/* Weak table marshaling does not increment external connections */
hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
ok(hres == S_OK, "CreateStreamOnHGlobal failed: %08x\n", hres);
hres = CoReleaseMarshalData(stream);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
+
+ IStream_Release(stream);
}
START_TEST(tmarshal)