static HRESULT change_type(VARIANT *dst, VARIANT *src, VARTYPE vt, IServiceProvider *caller) { V_VT(dst) = VT_EMPTY; if(caller) { IVariantChangeType *change_type = NULL; HRESULT hres; hres = IServiceProvider_QueryService(caller, &SID_VariantConversion, &IID_IVariantChangeType, (void**)&change_type); if(SUCCEEDED(hres)) { hres = IVariantChangeType_ChangeType(change_type, dst, src, LOCALE_NEUTRAL, vt); IVariantChangeType_Release(change_type); return hres; } } switch(vt) { case VT_BOOL: if(V_VT(src) == VT_BSTR) { V_VT(dst) = VT_BOOL; V_BOOL(dst) = V_BSTR(src) && *V_BSTR(src) ? VARIANT_TRUE : VARIANT_FALSE; return S_OK; } break; } return VariantChangeType(dst, src, 0, vt); }
static void _call_change_type(unsigned line, IVariantChangeType *change_type, VARIANT *dst, VARIANT *src, VARTYPE vt) { HRESULT hres; VariantInit(dst); hres = IVariantChangeType_ChangeType(change_type, dst, src, 0, vt); ok_(__FILE__,line)(hres == S_OK, "ChangeType(%d) failed: %08x\n", vt, hres); ok_(__FILE__,line)(V_VT(dst) == vt, "V_VT(dst) = %d\n", V_VT(dst)); }
static void _change_type_fail(unsigned line, IVariantChangeType *change_type, VARIANT *src, VARTYPE vt, HRESULT exhres) { VARIANT v; HRESULT hres; V_VT(&v) = VT_EMPTY; hres = IVariantChangeType_ChangeType(change_type, &v, src, 0, vt); ok_(__FILE__,line)(hres == exhres, "ChangeType failed: %08x, expected %08x\n", hres, exhres); }
static void test_change_types(IVariantChangeType *change_type, IDispatch *obj_disp) { VARIANT v, dst; HRESULT hres; static const conv_results_t bool_results[] = { {0, "false", VARIANT_FALSE, 1,0.0}, {1, "true", VARIANT_TRUE, 1,1.0}}; static const conv_results_t int_results[] = { {0, "0", VARIANT_FALSE, 1,0.0}, {-100, "-100", VARIANT_TRUE, 1,-100.0}, {0x10010, "65552", VARIANT_TRUE, 1,65552.0}}; static const conv_results_t empty_results = {0, "undefined", VARIANT_FALSE, 0,0}; static const conv_results_t null_results = {0, "null", VARIANT_FALSE, 0,0}; static const conv_results_t obj_results = {10, "strval", VARIANT_TRUE, 1,10.0}; V_VT(&v) = VT_BOOL; V_BOOL(&v) = VARIANT_FALSE; test_change_type(change_type, &v, bool_results); V_BOOL(&v) = VARIANT_TRUE; test_change_type(change_type, &v, bool_results+1); V_VT(&v) = VT_I4; V_I4(&v) = 0; test_change_type(change_type, &v, int_results); V_I4(&v) = -100; test_change_type(change_type, &v, int_results+1); V_I4(&v) = 0x10010; test_change_type(change_type, &v, int_results+2); V_VT(&v) = VT_EMPTY; test_change_type(change_type, &v, &empty_results); V_VT(&v) = VT_NULL; test_change_type(change_type, &v, &null_results); V_VT(&v) = VT_DISPATCH; V_DISPATCH(&v) = obj_disp; test_change_type(change_type, &v, &obj_results); V_VT(&v) = VT_BOOL; V_BOOL(&v) = VARIANT_FALSE; V_VT(&dst) = 0xdead; hres = IVariantChangeType_ChangeType(change_type, &dst, &v, 0, VT_I4); ok(hres == DISP_E_BADVARTYPE, "ChangeType failed: %08x, expected DISP_E_BADVARTYPE\n", hres); ok(V_VT(&dst) == 0xdead, "V_VT(dst) = %d\n", V_VT(&dst)); }
static HRESULT change_type(VARIANT *dst, VARIANT *src, VARTYPE vt, IServiceProvider *caller) { V_VT(dst) = VT_EMPTY; if(caller) { IVariantChangeType *change_type = NULL; HRESULT hres; hres = IServiceProvider_QueryService(caller, &SID_VariantConversion, &IID_IVariantChangeType, (void**)&change_type); if(SUCCEEDED(hres)) { hres = IVariantChangeType_ChangeType(change_type, dst, src, LOCALE_NEUTRAL, vt); IVariantChangeType_Release(change_type); return hres; } } return VariantChangeType(dst, src, 0, vt); }