Module: wine Branch: master Commit: f7ef02bd8f74ea052d61e48cd84b226d8a5867a8 URL: https://gitlab.winehq.org/wine/wine/-/commit/f7ef02bd8f74ea052d61e48cd84b226...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Oct 3 18:41:11 2023 +0200
propsys: Partially implement VariantToString().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55708 Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
---
dlls/propsys/propsys.spec | 2 +- dlls/propsys/propvar.c | 32 ++++++++++++++++++++++++++++++++ dlls/propsys/tests/propsys.c | 30 ++++++++++++++++++++++++++++++ include/propvarutil.h | 1 + 4 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec index cf7a4c299f4..b2d48a87577 100644 --- a/dlls/propsys/propsys.spec +++ b/dlls/propsys/propsys.spec @@ -190,7 +190,7 @@ @ stub VariantToInt64WithDefault @ stub VariantToPropVariant @ stub VariantToStrRet -@ stub VariantToString +@ stdcall VariantToString(ptr ptr long) @ stub VariantToStringAlloc @ stub VariantToStringArray @ stub VariantToStringArrayAlloc diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index c170f82c598..bf77e7d51e5 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -431,6 +431,38 @@ PCWSTR WINAPI VariantToStringWithDefault(const VARIANT *pvar, const WCHAR *defau return default_value; }
+/****************************************************************** + * VariantToString (PROPSYS.@) + */ +HRESULT WINAPI VariantToString(REFVARIANT var, PWSTR ret, UINT cch) +{ + WCHAR *str = NULL; + + TRACE("%p, %p, %u.\n", var, ret, cch); + + *ret = 0; + + if (!cch) + return E_INVALIDARG; + + if (V_VT(var) == VT_BSTR) + { + str = V_BSTR(var); + } + else + { + FIXME("Unsupported type %d.\n", V_VT(var)); + + return E_NOTIMPL; + } + + if (wcslen(str) > cch - 1) + return STRSAFE_E_INSUFFICIENT_BUFFER; + wcscpy(ret, str); + + return S_OK; +} + /****************************************************************** * PropVariantChangeType (PROPSYS.@) */ diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 2d683a3bdf5..dab0537991b 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -2277,6 +2277,35 @@ static void test_VariantToStringWithDefault(void) SysFreeString(b); }
+static void test_VariantToString(void) +{ + HRESULT hr; + VARIANT v; + WCHAR buff[64]; + + buff[0] = 1; + V_VT(&v) = VT_EMPTY; + hr = VariantToString(&v, buff, 64); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!buff[0], "Unexpected buffer.\n"); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocString(L"test1"); + + buff[0] = 1; + hr = VariantToString(&v, buff, 0); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(!buff[0], "Unexpected buffer.\n"); + + hr = VariantToString(&v, buff, 5); + ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Unexpected hr %#lx.\n", hr); + hr = VariantToString(&v, buff, 6); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(buff, L"test1"), "Unexpected string.\n"); + VariantClear(&v); +} + START_TEST(propsys) { test_InitPropVariantFromGUIDAsString(); @@ -2304,4 +2333,5 @@ START_TEST(propsys) test_propertystore(); test_PSCreatePropertyStoreFromObject(); test_VariantToStringWithDefault(); + test_VariantToString(); } diff --git a/include/propvarutil.h b/include/propvarutil.h index 575c498b230..6c1878c6aa5 100644 --- a/include/propvarutil.h +++ b/include/propvarutil.h @@ -95,6 +95,7 @@ HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb) HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch); PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault); PCWSTR WINAPI VariantToStringWithDefault(const VARIANT *pvar, LPCWSTR pszDefault); +HRESULT WINAPI VariantToString(REFVARIANT var, PWSTR ret, UINT cch);
HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret);