On 2/15/19 11:16 AM, Jactry Zeng wrote:
Signed-off-by: Jactry Zeng jzeng@codeweavers.com
dlls/propsys/propsys.spec | 2 +- dlls/propsys/propvar.c | 13 ++++++++++++ dlls/propsys/tests/propsys.c | 39 ++++++++++++++++++++++++++++++++++++ include/propvarutil.h | 1 + 4 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec index d9347e27ae..8416b6dc74 100644 --- a/dlls/propsys/propsys.spec +++ b/dlls/propsys/propsys.spec @@ -111,7 +111,7 @@ @ stub PropVariantToBooleanVector @ stub PropVariantToBooleanVectorAlloc @ stub PropVariantToBooleanWithDefault -@ stub PropVariantToBuffer +@ stdcall PropVariantToBuffer(ptr ptr long) @ stdcall PropVariantToDouble(ptr ptr) @ stub PropVariantToDoubleVector @ stub PropVariantToDoubleVectorAlloc diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index 988cf81971..5817d502f3 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -306,6 +306,19 @@ HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret) return hr; }
+HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb) +{
- TRACE("(%p, %p, %d)\n", propvarIn, ret, cb);
- if(cb > propvarIn->u.caub.cElems)
return E_FAIL;
- memcpy(ret, propvarIn->u.caub.pElems, cb);
- return S_OK;
+}
This one should probably check variant type.
- HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch) { HRESULT hr;
diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 059b622544..1e5e88bc3b 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -1407,6 +1407,44 @@ static void test_PropVariantToString(void) SysFreeString(propvar.u.bstrVal); }
+static void test_PropVariantToBuffer(void) +{
- PROPVARIANT propvar;
- HRESULT hr;
- UINT8 data[] = {1,2,3,4,5,6,7,8,9,10};
- UINT8 buffer[256];
- hr = InitPropVariantFromBuffer(data, 10, &propvar);
- ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr);
- hr = PropVariantToBuffer(&propvar, NULL, 0); /* crash when cb isn't zero */
- ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr);
- PropVariantClear(&propvar);
- hr = InitPropVariantFromBuffer(data, 10, &propvar);
- ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr);
- hr = PropVariantToBuffer(&propvar, buffer, 10);
- ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr);
- ok(!memcmp(buffer, data, 10) && !buffer[10], "got wrong buffer.\n");
- memset(buffer, 0, sizeof(buffer));
- PropVariantClear(&propvar);
- hr = InitPropVariantFromBuffer(data, 10, &propvar);
- ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr);
- hr = PropVariantToBuffer(&propvar, buffer, 11);
- ok(hr == E_FAIL, "PropVariantToBuffer fail: 0x%08x.\n", hr);
- ok(!buffer[0], "got wrong buffer.\n");
- memset(buffer, 0, sizeof(buffer));
- PropVariantClear(&propvar);
- hr = InitPropVariantFromBuffer(data, 10, &propvar);
- ok(hr == S_OK, "InitVariantFromBuffer failed 0x%08x.\n", hr);
- hr = PropVariantToBuffer(&propvar, buffer, 9);
- ok(hr == S_OK, "PropVariantToBuffer fail: 0x%08x.\n", hr);
- ok(!memcmp(buffer, data, 9) && !buffer[9], "got wrong buffer.\n");
- memset(buffer, 0, sizeof(buffer));
- PropVariantClear(&propvar);
+}
- START_TEST(propsys) { test_PSStringFromPropertyKey();
@@ -1424,4 +1462,5 @@ START_TEST(propsys) test_InitPropVariantFromCLSID(); test_PropVariantToDouble(); test_PropVariantToString();
- test_PropVariantToBuffer(); }
diff --git a/include/propvarutil.h b/include/propvarutil.h index 4fb12d87eb..a4eedefdb6 100644 --- a/include/propvarutil.h +++ b/include/propvarutil.h @@ -79,6 +79,7 @@ HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret); HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret); HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret); HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret); +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);