[2/5] ole32: Add tests for StgConvertPropertyToVariant.

Vincent Povirk madewokherd at gmail.com
Mon Aug 27 17:37:30 CDT 2012


-------------- next part --------------
From 10c829c808decd180ee54d2b9fc274b0143f43c9 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Mon, 27 Aug 2012 15:50:56 -0500
Subject: [PATCH 2/5] ole32: Add tests for StgConvertPropertyToVariant.

---
 dlls/ole32/tests/propvariant.c |  159 ++++++++++++++++++++++++++++++++++++++++
 include/propidl.idl            |    4 +
 2 files changed, 163 insertions(+)

diff --git a/dlls/ole32/tests/propvariant.c b/dlls/ole32/tests/propvariant.c
index 50adfe7..631a200 100644
--- a/dlls/ole32/tests/propvariant.c
+++ b/dlls/ole32/tests/propvariant.c
@@ -245,8 +245,167 @@ static void test_copy(void)
     memset(&propvarSrc, 0, sizeof(propvarSrc));
 }
 
+struct _PMemoryAllocator_vtable {
+    void *Allocate; /* virtual void* Allocate(ULONG cbSize); */
+    void *Free; /* virtual void Free(void *pv); */
+};
+
+typedef struct _PMemoryAllocator {
+    struct _PMemoryAllocator_vtable *vt;
+} PMemoryAllocator;
+
+#ifdef __i386__
+#define __thiscall __stdcall
+#else
+#define __thiscall __cdecl
+#endif
+
+void * __thiscall PMemoryAllocator_Allocate(PMemoryAllocator *_this, ULONG cbSize)
+{
+    return CoTaskMemAlloc(cbSize);
+}
+
+void __thiscall PMemoryAllocator_Free(PMemoryAllocator *_this, void *pv)
+{
+    CoTaskMemFree(pv);
+}
+
+#include "pshpack1.h"
+typedef struct
+{
+    BYTE pop_eax;  /* popl  %eax  */
+    BYTE push_ecx; /* pushl %ecx  */
+    BYTE push_eax; /* pushl %eax  */
+    BYTE jmp_func; /* jmp   $func */
+    DWORD func;
+} THISCALL_TO_STDCALL_THUNK;
+#include "poppack.h"
+
+static THISCALL_TO_STDCALL_THUNK *wrapperCodeMem = NULL;
+
+static void fill_thunk(THISCALL_TO_STDCALL_THUNK *thunk, void *fn)
+{
+    thunk->pop_eax = 0x58;
+    thunk->push_ecx = 0x51;
+    thunk->push_eax = 0x50;
+    thunk->jmp_func = 0xe9;
+    thunk->func = (char*)fn - (char*)(&thunk->func + 1);
+}
+
+static void setup_vtable(struct _PMemoryAllocator_vtable *vtable)
+{
+#ifdef __i386__
+    wrapperCodeMem = VirtualAlloc(NULL, 2 * sizeof(*wrapperCodeMem),
+                                  MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+
+    fill_thunk(&wrapperCodeMem[0], PMemoryAllocator_Allocate);
+    fill_thunk(&wrapperCodeMem[1], PMemoryAllocator_Free);
+
+    vtable->Allocate = &wrapperCodeMem[0];
+    vtable->Free = &wrapperCodeMem[1];
+#else
+    vtable->Allocate = PMemoryAllocator_Allocate;
+    vtable->Free = PMemoryAllocator_Free;
+#endif
+}
+
+const char serialized_empty[] = {
+    0,0, /* VT_EMPTY */
+    0,0, /* padding */
+};
+
+const char serialized_null[] = {
+    1,0, /* VT_NULL */
+    0,0, /* padding */
+};
+
+const char serialized_i4[] = {
+    3,0, /* VT_I4 */
+    0,0, /* padding */
+    0xef,0xcd,0xab,0xfe
+};
+
+const char serialized_bstr_wc[] = {
+    8,0, /* VT_BSTR */
+    0,0, /* padding */
+    10,0,0,0, /* size */
+    't',0,'e',0,
+    's',0,'t',0,
+    0,0,0,0
+};
+
+const char serialized_bstr_mb[] = {
+    8,0, /* VT_BSTR */
+    0,0, /* padding */
+    5,0,0,0, /* size */
+    't','e','s','t',
+    0,0,0,0
+};
+
+static void test_propertytovariant(void)
+{
+    HANDLE hole32;
+    BOOLEAN (__stdcall *pStgConvertPropertyToVariant)(const SERIALIZEDPROPERTYVALUE*,USHORT,PROPVARIANT*,PMemoryAllocator*);
+    PROPVARIANT propvar;
+    PMemoryAllocator allocator;
+    struct _PMemoryAllocator_vtable vtable;
+    BOOLEAN ret;
+    static const WCHAR test_string[] = {'t','e','s','t',0};
+
+    hole32 = GetModuleHandleA("ole32");
+
+    pStgConvertPropertyToVariant = (void*)GetProcAddress(hole32, "StgConvertPropertyToVariant");
+
+    if (!pStgConvertPropertyToVariant)
+    {
+        todo_wine win_skip("StgConvertPropertyToVariant not available\n");
+        return;
+    }
+
+    setup_vtable(&vtable);
+    allocator.vt = &vtable;
+
+    ret = pStgConvertPropertyToVariant((SERIALIZEDPROPERTYVALUE*)serialized_empty,
+        CP_WINUNICODE, &propvar, &allocator);
+
+    ok(ret == 0, "StgConvertPropertyToVariant returned %i\n", ret);
+    ok(propvar.vt == VT_EMPTY, "unexpected vt %x\n", propvar.vt);
+
+    ret = pStgConvertPropertyToVariant((SERIALIZEDPROPERTYVALUE*)serialized_null,
+        CP_WINUNICODE, &propvar, &allocator);
+
+    ok(ret == 0, "StgConvertPropertyToVariant returned %i\n", ret);
+    ok(propvar.vt == VT_NULL, "unexpected vt %x\n", propvar.vt);
+
+    ret = pStgConvertPropertyToVariant((SERIALIZEDPROPERTYVALUE*)serialized_i4,
+        CP_WINUNICODE, &propvar, &allocator);
+
+    ok(ret == 0, "StgConvertPropertyToVariant returned %i\n", ret);
+    ok(propvar.vt == VT_I4, "unexpected vt %x\n", propvar.vt);
+    ok(U(propvar).lVal == 0xfeabcdef, "unexpected lVal %x\n", U(propvar).lVal);
+
+    ret = pStgConvertPropertyToVariant((SERIALIZEDPROPERTYVALUE*)serialized_bstr_wc,
+        CP_WINUNICODE, &propvar, &allocator);
+
+    ok(ret == 0, "StgConvertPropertyToVariant returned %i\n", ret);
+    ok(propvar.vt == VT_BSTR, "unexpected vt %x\n", propvar.vt);
+    ok(!lstrcmpW(U(propvar).bstrVal, test_string), "unexpected string value\n");
+    PropVariantClear(&propvar);
+
+    ret = pStgConvertPropertyToVariant((SERIALIZEDPROPERTYVALUE*)serialized_bstr_mb,
+        CP_UTF8, &propvar, &allocator);
+
+    ok(ret == 0, "StgConvertPropertyToVariant returned %i\n", ret);
+    ok(propvar.vt == VT_BSTR, "unexpected vt %x\n", propvar.vt);
+    ok(!lstrcmpW(U(propvar).bstrVal, test_string), "unexpected string value\n");
+    PropVariantClear(&propvar);
+
+    VirtualFree(wrapperCodeMem, 0, MEM_RELEASE);
+}
+
 START_TEST(propvariant)
 {
     test_validtypes();
     test_copy();
+    test_propertytovariant();
 }
diff --git a/include/propidl.idl b/include/propidl.idl
index 3fc7515..fbe80d8 100644
--- a/include/propidl.idl
+++ b/include/propidl.idl
@@ -431,6 +431,10 @@ interface IEnumSTATPROPSETSTG : IUnknown
     [out] IEnumSTATPROPSETSTG **ppenum);
 }
 
+typedef struct SERIALIZEDPROPERTYVALUE {
+    DWORD dwType;
+    BYTE rgb[1];
+} SERIALIZEDPROPERTYVALUE;
 
 cpp_quote("HRESULT WINAPI FreePropVariantArray(ULONG,PROPVARIANT*);")
 cpp_quote("HRESULT WINAPI PropVariantClear(PROPVARIANT*);")
-- 
1.7.9.5


More information about the wine-patches mailing list