[PATCH] propsys: Add InitPropVariantFromCLSID().

Nikolay Sivov nsivov at codeweavers.com
Sun Sep 16 08:48:41 CDT 2018


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45347
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/propsys/propsys.spec    |  2 +-
 dlls/propsys/propvar.c       | 13 +++++++++++++
 dlls/propsys/tests/propsys.c | 19 +++++++++++++++++++
 include/propvarutil.h        |  1 +
 4 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec
index db20fd39c9..bbc71654a8 100644
--- a/dlls/propsys/propsys.spec
+++ b/dlls/propsys/propsys.spec
@@ -29,7 +29,7 @@
 @ stdcall -private DllUnregisterServer()
 @ stub InitPropVariantFromBooleanVector
 @ stdcall InitPropVariantFromBuffer(ptr long ptr)
-@ stub InitPropVariantFromCLSID
+@ stdcall InitPropVariantFromCLSID(ptr ptr)
 @ stub InitPropVariantFromDoubleVector
 @ stub InitPropVariantFromFileTime
 @ stub InitPropVariantFromFileTimeVector
diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c
index e6d4eba57c..ae96e4ee69 100644
--- a/dlls/propsys/propvar.c
+++ b/dlls/propsys/propvar.c
@@ -570,6 +570,19 @@ HRESULT WINAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *p
     return S_OK;
 }
 
+HRESULT WINAPI InitPropVariantFromCLSID(REFCLSID clsid, PROPVARIANT *ppropvar)
+{
+    TRACE("(%s %p)\n", debugstr_guid(clsid), ppropvar);
+
+    ppropvar->u.puuid = CoTaskMemAlloc(sizeof(*ppropvar->u.puuid));
+    if(!ppropvar->u.puuid)
+        return E_OUTOFMEMORY;
+
+    ppropvar->vt = VT_CLSID;
+    memcpy(ppropvar->u.puuid, clsid, sizeof(*ppropvar->u.puuid));
+    return S_OK;
+}
+
 HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar)
 {
     SAFEARRAY *arr;
diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c
index e899ff9dc4..34c51b382b 100644
--- a/dlls/propsys/tests/propsys.c
+++ b/dlls/propsys/tests/propsys.c
@@ -1230,6 +1230,24 @@ static void test_PropVariantChangeType_LPWSTR(void)
     PropVariantClear(&src);
 }
 
+static void test_InitPropVariantFromCLSID(void)
+{
+    PROPVARIANT propvar;
+    GUID clsid;
+    HRESULT hr;
+
+    memset(&propvar, 0, sizeof(propvar));
+    propvar.vt = VT_I4;
+    propvar.u.lVal = 15;
+
+    memset(&clsid, 0xcc, sizeof(clsid));
+    hr = InitPropVariantFromCLSID(&clsid, &propvar);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(propvar.vt == VT_CLSID, "Unexpected type %d.\n", propvar.vt);
+    ok(IsEqualGUID(propvar.u.puuid, &clsid), "Unexpected puuid value.\n");
+    PropVariantClear(&propvar);
+}
+
 START_TEST(propsys)
 {
     test_PSStringFromPropertyKey();
@@ -1244,4 +1262,5 @@ START_TEST(propsys)
     test_PropVariantChangeType_LPWSTR();
     test_PropVariantToBoolean();
     test_PropVariantToStringWithDefault();
+    test_InitPropVariantFromCLSID();
 }
diff --git a/include/propvarutil.h b/include/propvarutil.h
index ced51ec295..0285cafbb4 100644
--- a/include/propvarutil.h
+++ b/include/propvarutil.h
@@ -64,6 +64,7 @@ HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT p
 HRESULT WINAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar);
 HRESULT WINAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar);
 HRESULT WINAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar);
+HRESULT WINAPI InitPropVariantFromCLSID(REFCLSID clsid, PROPVARIANT *ppropvar);
 HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar);
 HRESULT WINAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid);
 HRESULT WINAPI VariantToGUID(const VARIANT *pvar, GUID *guid);
-- 
2.18.0




More information about the wine-devel mailing list