From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/propsys/propvar.c | 22 ++++++++++++++++++++-- dlls/propsys/tests/propsys.c | 6 +++--- 2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index e0e05783ba1..928c46d4978 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -401,9 +401,23 @@ HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch return hr; }
-static HRESULT string_alloc_from_uint(ULONG64 value, WCHAR **ret) +static HRESULT string_alloc_from_int(const PROPVARIANT *var, WCHAR **ret) { WCHAR buffer[64], *out = buffer + ARRAY_SIZE(buffer) - 1; + BOOL negative = FALSE; + ULONG64 value; + + switch (var->vt) + { + case VT_I4: + value = (negative = var->lVal < 0) ? -var->lVal : var->lVal; + break; + case VT_UI2: + value = var->uiVal; + break; + default: + return E_UNEXPECTED; + }
*out-- = 0;
@@ -416,6 +430,9 @@ static HRESULT string_alloc_from_uint(ULONG64 value, WCHAR **ret)
out++;
+ if (negative) + *--out = '-'; + if (!(*ret = CoTaskMemAlloc((wcslen(out) + 1) * sizeof(*out)))) return E_OUTOFMEMORY; wcscpy(*ret, out); @@ -472,8 +489,9 @@ HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret) } break;
+ case VT_I4: case VT_UI2: - hr = string_alloc_from_uint(propvarIn->uiVal, &res); + hr = string_alloc_from_int(propvarIn, &res); break;
default: diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 24d06a95cb7..b6252f53138 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -1664,8 +1664,8 @@ static void test_PropVariantToString(void) propvar.vt = VT_I4; propvar.lVal = 22; hr = PropVariantToString(&propvar, bufferW, ARRAY_SIZE(bufferW)); - todo_wine ok(hr == S_OK, "PropVariantToString failed: 0x%08lx.\n", hr); - todo_wine ok(!lstrcmpW(bufferW, L"22"), "got wrong string: "%s".\n", wine_dbgstr_w(bufferW)); + ok(hr == S_OK, "PropVariantToString failed: 0x%08lx.\n", hr); + ok(!lstrcmpW(bufferW, L"22"), "got wrong string: "%s".\n", wine_dbgstr_w(bufferW)); memset(bufferW, 0, sizeof(bufferW)); PropVariantClear(&propvar);
@@ -1768,7 +1768,6 @@ static void test_PropVariantToBSTR(void) { check_PropVariantToBSTR(VT_I1, cVal, -123, L"-123"); check_PropVariantToBSTR(VT_I2, iVal, -456, L"-456"); - check_PropVariantToBSTR(VT_I4, lVal, -789, L"-789"); check_PropVariantToBSTR(VT_I8, hVal.QuadPart, -101112, L"-101112"); check_PropVariantToBSTR(VT_UI1, bVal, 0xcd, L"205"); check_PropVariantToBSTR(VT_UI4, ulVal, 0xdeadbeef, L"3735928559"); @@ -1777,6 +1776,7 @@ static void test_PropVariantToBSTR(void) check_PropVariantToBSTR(VT_R4, fltVal, 0.125f, L"0.125"); check_PropVariantToBSTR(VT_R8, dblVal, 0.456, L"0.456"); } + check_PropVariantToBSTR(VT_I4, lVal, -789, L"-789"); check_PropVariantToBSTR(VT_UI2, uiVal, 57005, L"57005"); check_PropVariantToBSTR(VT_CLSID, puuid, (CLSID *)&dummy_guid, dummy_guid_str); check_PropVariantToBSTR(VT_LPSTR, pszVal, (char *)topic, topicW);