Jactry Zeng : propsys: Implement PropVariantToDouble().
Alexandre Julliard
julliard at winehq.org
Thu Feb 14 16:19:12 CST 2019
Module: wine
Branch: master
Commit: 3fc1180623b9a0c9fc9e16abf358b179f2eff49b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3fc1180623b9a0c9fc9e16abf358b179f2eff49b
Author: Jactry Zeng <jzeng at codeweavers.com>
Date: Thu Feb 7 16:33:14 2019 +0800
propsys: Implement PropVariantToDouble().
Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 19c5a24..9193f36 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 ae96e4e..0edf462 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 34c51b3..a9c0a77 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 0285caf..80f081c 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);
More information about the wine-cvs
mailing list