Piotr Caban : propsys: Added InitVariantFromBuffer implementation.

Alexandre Julliard julliard at winehq.org
Fri Sep 16 13:28:31 CDT 2011


Module: wine
Branch: master
Commit: f8dd85f246ee5f2a8a999b2b8287170c526cebc6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f8dd85f246ee5f2a8a999b2b8287170c526cebc6

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Sep 16 11:20:37 2011 +0200

propsys: Added InitVariantFromBuffer implementation.

---

 dlls/propsys/propsys.spec |    4 ++--
 dlls/propsys/propvar.c    |   45 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec
index e738985..5bcb483 100644
--- a/dlls/propsys/propsys.spec
+++ b/dlls/propsys/propsys.spec
@@ -28,7 +28,7 @@
 @ stub DllRegisterServer
 @ stub DllUnregisterServer
 @ stub InitPropVariantFromBooleanVector
-@ stub InitPropVariantFromBuffer
+@ stdcall InitPropVariantFromBuffer(ptr long ptr)
 @ stub InitPropVariantFromCLSID
 @ stub InitPropVariantFromDoubleVector
 @ stub InitPropVariantFromFileTime
@@ -47,7 +47,7 @@
 @ stub InitPropVariantFromUInt64Vector
 @ stub InitPropVariantVectorFromPropVariant
 @ stub InitVariantFromBooleanArray
-@ stub InitVariantFromBuffer
+@ stdcall InitVariantFromBuffer(ptr long ptr)
 @ stub InitVariantFromDoubleArray
 @ stub InitVariantFromFileTime
 @ stub InitVariantFromFileTimeArray
diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c
index d59173c..01a1d5f 100644
--- a/dlls/propsys/propvar.c
+++ b/dlls/propsys/propvar.c
@@ -132,3 +132,48 @@ HRESULT WINAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar)
     PROPVAR_GUIDToWSTR(guid, V_BSTR(pvar));
     return S_OK;
 }
+
+HRESULT WINAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar)
+{
+    TRACE("(%p %u %p)\n", pv, cb, ppropvar);
+
+    ppropvar->u.caub.pElems = CoTaskMemAlloc(cb);
+    if(!ppropvar->u.caub.pElems)
+        return E_OUTOFMEMORY;
+
+    ppropvar->vt = VT_VECTOR|VT_UI1;
+    ppropvar->u.caub.cElems = cb;
+    memcpy(ppropvar->u.caub.pElems, pv, cb);
+    return S_OK;
+}
+
+HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar)
+{
+    SAFEARRAY *arr;
+    void *data;
+    HRESULT hres;
+
+    TRACE("(%p %u %p)\n", pv, cb, pvar);
+
+    arr = SafeArrayCreateVector(VT_UI1, 0, cb);
+    if(!arr)
+        return E_OUTOFMEMORY;
+
+    hres = SafeArrayAccessData(arr, &data);
+    if(FAILED(hres)) {
+        SafeArrayDestroy(arr);
+        return hres;
+    }
+
+    memcpy(data, pv, cb);
+
+    hres = SafeArrayUnaccessData(arr);
+    if(FAILED(hres)) {
+        SafeArrayDestroy(arr);
+        return hres;
+    }
+
+    V_VT(pvar) = VT_ARRAY|VT_UI1;
+    V_ARRAY(pvar) = arr;
+    return S_OK;
+}




More information about the wine-cvs mailing list