From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/propsys/propvar.c | 26 ++++++++++++++++++++++++++ dlls/propsys/tests/propsys.c | 9 ++++++++- 2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index d681b910e90..e0e05783ba1 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -401,6 +401,28 @@ HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch return hr; }
+static HRESULT string_alloc_from_uint(ULONG64 value, WCHAR **ret) +{ + WCHAR buffer[64], *out = buffer + ARRAY_SIZE(buffer) - 1; + + *out-- = 0; + + do + { + unsigned int next_digit = value % 10; + *out-- = '0' + next_digit; + value = value / 10; + } while (value); + + out++; + + if (!(*ret = CoTaskMemAlloc((wcslen(out) + 1) * sizeof(*out)))) + return E_OUTOFMEMORY; + wcscpy(*ret, out); + + return S_OK; +} + HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret) { WCHAR *res = NULL; @@ -450,6 +472,10 @@ HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret) } break;
+ case VT_UI2: + hr = string_alloc_from_uint(propvarIn->uiVal, &res); + break; + default: FIXME("Unsupported conversion (%d)\n", propvarIn->vt); hr = E_FAIL; diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index b266813cc91..24d06a95cb7 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -670,6 +670,13 @@ static void test_PropVariantToStringAlloc(void) ok(hres == S_OK, "PropVariantToStringAlloc returned %#lx.\n", hres); ok(!wcscmp(str, dummy_guid_str), "Unexpected str %s.\n", debugstr_w(str)); CoTaskMemFree(str); + + prop.vt = VT_UI2; + prop.uiVal = 123; + hres = PropVariantToStringAlloc(&prop, &str); + ok(hres == S_OK, "PropVariantToStringAlloc returned %#lx.\n", hres); + ok(!wcscmp(str, L"123"), "Unexpected str %s.\n", debugstr_w(str)); + CoTaskMemFree(str); }
static void test_PropVariantCompareEx(void) @@ -1764,13 +1771,13 @@ static void test_PropVariantToBSTR(void) 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_UI2, uiVal, 0xdead, L"57005"); check_PropVariantToBSTR(VT_UI4, ulVal, 0xdeadbeef, L"3735928559"); check_PropVariantToBSTR(VT_UI8, uhVal.QuadPart, 0xdeadbeefdeadbeef, L"16045690984833335023"); check_PropVariantToBSTR(VT_BOOL, boolVal, TRUE, L"1"); check_PropVariantToBSTR(VT_R4, fltVal, 0.125f, L"0.125"); check_PropVariantToBSTR(VT_R8, dblVal, 0.456, L"0.456"); } + 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); check_PropVariantToBSTR(VT_LPWSTR, pwszVal, (WCHAR *)topicW, topicW);