From: Jactry Zeng Subject: [PATCH 3/3] propsys: Implement PropVariantToDouble(). Message-Id: <4b40086f-a286-8bfe-10be-7751e9abbc14@codeweavers.com> Date: Thu, 7 Feb 2019 16:33:14 +0800 Signed-off-by: Jactry Zeng --- dlls/propsys/propsys.spec | 2 +- dlls/propsys/propvar.c | 18 ++++++++++++ dlls/propsys/tests/propsys.c | 57 ++++++++++++++++++++++++++++++++++++ include/propvarutil.h | 1 + 4 files changed, 77 insertions(+), 1 deletion(-) diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec index 19c5a24c92..9193f3664d 100644 --- a/dlls/propsys/propsys.spec +++ b/dlls/propsys/propsys.spec @@ -112,7 +112,7 @@ @ stub PropVariantToBooleanVectorAlloc @ stub PropVariantToBooleanWithDefault @ stub PropVariantToBuffer -@ stub PropVariantToDouble +@ stdcall PropVariantToDouble(ptr ptr) @ stub PropVariantToDoubleVector @ stub PropVariantToDoubleVectorAlloc @ stub PropVariantToDoubleWithDefault diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index ae96e4ee69..0edf4621b3 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -129,6 +129,12 @@ static HRESULT PROPVAR_ConvertNumber(REFPROPVARIANT pv, int dest_bits, src_signed = *res < 0; break; } + case VT_R8: + { + src_signed = TRUE; + *res = pv->u.dblVal; + break; + } default: FIXME("unhandled vt %d\n", pv->vt); return E_NOTIMPL; @@ -155,6 +161,18 @@ static HRESULT PROPVAR_ConvertNumber(REFPROPVARIANT pv, int dest_bits, return S_OK; } +HRESULT WINAPI PropVariantToDouble(REFPROPVARIANT propvarIn, double *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("(%p, %p)\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 64, TRUE, &res); + if (SUCCEEDED(hr)) *ret = (double)res; + return hr; +} + HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret) { LONGLONG res; diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 34c51b382b..a9c0a7730b 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -1248,6 +1248,62 @@ static void test_InitPropVariantFromCLSID(void) PropVariantClear(&propvar); } +static void test_PropVariantToDouble(void) +{ + PROPVARIANT propvar; + double value; + HRESULT hr; + + PropVariantInit(&propvar); + propvar.vt = VT_R8; + propvar.u.dblVal = 15.0; + hr = PropVariantToDouble(&propvar, &value); + ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr); + ok(value == 15.0, "Unexpected value: %f.\n", value); + + PropVariantClear(&propvar); + propvar.vt = VT_I4; + propvar.u.lVal = 123; + hr = PropVariantToDouble(&propvar, &value); + ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr); + ok(value == 123.0, "Unexpected value: %f.\n", value); + + PropVariantClear(&propvar); + propvar.vt = VT_I4; + propvar.u.lVal = -256; + hr = PropVariantToDouble(&propvar, &value); + ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr); + ok(value == -256, "Unexpected value: %f\n", value); + + PropVariantClear(&propvar); + propvar.vt = VT_I8; + propvar.u.lVal = 65536; + hr = PropVariantToDouble(&propvar, &value); + ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr); + ok(value == 65536.0, "Unexpected value: %f.\n", value); + + PropVariantClear(&propvar); + propvar.vt = VT_I8; + propvar.u.lVal = -321; + hr = PropVariantToDouble(&propvar, &value); + ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr); + ok(value == 4294966975.0, "Unexpected value: %f.\n", value); + + PropVariantClear(&propvar); + propvar.vt = VT_UI4; + propvar.u.ulVal = 6; + hr = PropVariantToDouble(&propvar, &value); + ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr); + ok(value == 6.0, "Unexpected value: %f.\n", value); + + PropVariantClear(&propvar); + propvar.vt = VT_UI8; + propvar.u.uhVal.QuadPart = 8; + hr = PropVariantToDouble(&propvar, &value); + ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr); + ok(value == 8.0, "Unexpected value: %f.\n", value); +} + START_TEST(propsys) { test_PSStringFromPropertyKey(); @@ -1263,4 +1319,5 @@ START_TEST(propsys) test_PropVariantToBoolean(); test_PropVariantToStringWithDefault(); test_InitPropVariantFromCLSID(); + test_PropVariantToDouble(); } diff --git a/include/propvarutil.h b/include/propvarutil.h index 0285cafbb4..80f081cbc3 100644 --- a/include/propvarutil.h +++ b/include/propvarutil.h @@ -71,6 +71,7 @@ HRESULT WINAPI VariantToGUID(const VARIANT *pvar, GUID *guid); INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2, PROPVAR_COMPARE_UNIT uint, PROPVAR_COMPARE_FLAGS flags); +HRESULT WINAPI PropVariantToDouble(REFPROPVARIANT propvarIn, double *ret); HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret); HRESULT WINAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret); HRESULT WINAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret); -- 2.20.1