From f8dd85f246ee5f2a8a999b2b8287170c526cebc6 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Fri, 16 Sep 2011 11:20:37 +0200 Subject: [PATCH] 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 e7389856d73..5bcb483c458 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 d59173c2adb..01a1d5f7e8e 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; +}