ole32: Add tests for StgConvertPropertyToVariant.
This commit is contained in:
parent
0537454eae
commit
ae722c45ad
|
@ -245,8 +245,172 @@ static void test_copy(void)
|
||||||
memset(&propvarSrc, 0, sizeof(propvarSrc));
|
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
|
||||||
|
|
||||||
|
static void * __thiscall PMemoryAllocator_Allocate(PMemoryAllocator *_this, ULONG cbSize)
|
||||||
|
{
|
||||||
|
return CoTaskMemAlloc(cbSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __thiscall PMemoryAllocator_Free(PMemoryAllocator *_this, void *pv)
|
||||||
|
{
|
||||||
|
CoTaskMemFree(pv);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __i386__
|
||||||
|
|
||||||
|
#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)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
|
||||||
|
static void setup_vtable(struct _PMemoryAllocator_vtable *vtable)
|
||||||
|
{
|
||||||
|
vtable->Allocate = PMemoryAllocator_Allocate;
|
||||||
|
vtable->Free = PMemoryAllocator_Free;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const char serialized_empty[] = {
|
||||||
|
0,0, /* VT_EMPTY */
|
||||||
|
0,0, /* padding */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char serialized_null[] = {
|
||||||
|
1,0, /* VT_NULL */
|
||||||
|
0,0, /* padding */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char serialized_i4[] = {
|
||||||
|
3,0, /* VT_I4 */
|
||||||
|
0,0, /* padding */
|
||||||
|
0xef,0xcd,0xab,0xfe
|
||||||
|
};
|
||||||
|
|
||||||
|
static 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
|
||||||
|
};
|
||||||
|
|
||||||
|
static 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);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(propvariant)
|
START_TEST(propvariant)
|
||||||
{
|
{
|
||||||
test_validtypes();
|
test_validtypes();
|
||||||
test_copy();
|
test_copy();
|
||||||
|
test_propertytovariant();
|
||||||
}
|
}
|
||||||
|
|
|
@ -431,6 +431,10 @@ interface IEnumSTATPROPSETSTG : IUnknown
|
||||||
[out] IEnumSTATPROPSETSTG **ppenum);
|
[out] IEnumSTATPROPSETSTG **ppenum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct SERIALIZEDPROPERTYVALUE {
|
||||||
|
DWORD dwType;
|
||||||
|
BYTE rgb[1];
|
||||||
|
} SERIALIZEDPROPERTYVALUE;
|
||||||
|
|
||||||
cpp_quote("HRESULT WINAPI FreePropVariantArray(ULONG,PROPVARIANT*);")
|
cpp_quote("HRESULT WINAPI FreePropVariantArray(ULONG,PROPVARIANT*);")
|
||||||
cpp_quote("HRESULT WINAPI PropVariantClear(PROPVARIANT*);")
|
cpp_quote("HRESULT WINAPI PropVariantClear(PROPVARIANT*);")
|
||||||
|
|
Loading…
Reference in New Issue