oleaut32: Implement ICreateTypeInfo2::SetCustData method.

This commit is contained in:
Andrey Turkin 2010-05-09 23:33:24 +04:00 committed by Alexandre Julliard
parent cb9a6af538
commit 658209b571
2 changed files with 86 additions and 3 deletions

View File

@ -975,6 +975,7 @@ static void test_CreateTypeLib(void) {
static OLECHAR typelibW[] = {'t','y','p','e','l','i','b',0};
static OLECHAR interface1W[] = {'i','n','t','e','r','f','a','c','e','1',0};
static OLECHAR interface2W[] = {'i','n','t','e','r','f','a','c','e','2',0};
static OLECHAR interface3W[] = {'i','n','t','e','r','f','a','c','e','3',0};
static OLECHAR dualW[] = {'d','u','a','l',0};
static OLECHAR coclassW[] = {'c','o','c','l','a','s','s',0};
static WCHAR defaultW[] = {'d','e','f','a','u','l','t',0x3213,0};
@ -984,13 +985,16 @@ static void test_CreateTypeLib(void) {
static OLECHAR param2W[] = {'p','a','r','a','m','2',0};
static OLECHAR *names1[] = {func1W, param1W, param2W};
static OLECHAR *names2[] = {func2W, param1W, param2W};
static const GUID custguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x70}};
char filename[MAX_PATH];
WCHAR filenameW[MAX_PATH];
ICreateTypeLib2 *createtl;
ICreateTypeInfo *createti;
ICreateTypeInfo2 *createti2;
ITypeLib *tl, *stdole;
ITypeInfo *interface1, *interface2, *dual, *unknown, *dispatch, *ti;
ITypeInfo2 *ti2;
FUNCDESC funcdesc;
ELEMDESC elemdesc[5];
PARAMDESCEX paramdescex;
@ -1001,6 +1005,7 @@ static void test_CreateTypeLib(void) {
BSTR name, docstring, helpfile;
DWORD helpcontext;
int impltypeflags;
VARIANT cust_data;
HRESULT hres;
trace("CreateTypeLib tests\n");
@ -1281,6 +1286,78 @@ static void test_CreateTypeLib(void) {
ICreateTypeInfo_Release(createti);
VariantInit(&cust_data);
hres = ICreateTypeLib_CreateTypeInfo(createtl, interface3W, TKIND_INTERFACE, &createti);
ok(hres == S_OK, "got %08x\n", hres);
hres = ICreateTypeInfo_QueryInterface(createti, &IID_ICreateTypeInfo2, (void**)&createti2);
ok(hres == S_OK, "got %08x\n", hres);
hres = ICreateTypeInfo2_QueryInterface(createti2, &IID_ITypeInfo2, (void**)&ti2);
ok(hres == S_OK, "got %08x\n", hres);
hres = ITypeInfo2_GetCustData(ti2, NULL, NULL);
todo_wine
ok(hres == E_INVALIDARG, "got %08x\n", hres);
hres = ITypeInfo2_GetCustData(ti2, &custguid, NULL);
todo_wine
ok(hres == E_INVALIDARG, "got %08x\n", hres);
hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
todo_wine
ok(hres == S_OK, "got %08x\n", hres);
hres = ICreateTypeInfo2_SetCustData(createti2, NULL, NULL);
ok(hres == E_INVALIDARG, "got %08x\n", hres);
hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, NULL);
ok(hres == E_INVALIDARG, "got %08x\n", hres);
hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
ok(hres == DISP_E_BADVARTYPE, "got %08x\n", hres);
V_VT(&cust_data) = VT_UI4;
V_I4(&cust_data) = 0xdeadbeef;
hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
ok(hres == S_OK, "got %08x\n", hres);
V_I4(&cust_data) = 0;
V_VT(&cust_data) = VT_EMPTY;
hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
todo_wine
ok(hres == S_OK, "got %08x\n", hres);
todo_wine
ok(V_VT(&cust_data) == VT_UI4, "got %d\n", V_VT(&cust_data));
todo_wine
ok(V_I4(&cust_data) == 0xdeadbeef, "got 0x%08x\n", V_I4(&cust_data));
V_VT(&cust_data) = VT_UI4;
V_I4(&cust_data) = 12345678;
hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
ok(hres == S_OK, "got %08x\n", hres);
V_I4(&cust_data) = 0;
V_VT(&cust_data) = VT_EMPTY;
hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
todo_wine
ok(hres == S_OK, "got %08x\n", hres);
todo_wine
ok(V_VT(&cust_data) == VT_UI4, "got %d\n", V_VT(&cust_data));
todo_wine
ok(V_I4(&cust_data) == 12345678, "got 0x%08x\n", V_I4(&cust_data));
ITypeInfo2_Release(ti2);
ICreateTypeInfo2_Release(createti2);
ICreateTypeInfo_Release(createti);
hres = ICreateTypeLib_CreateTypeInfo(createtl, coclassW, TKIND_COCLASS, &createti);
ok(hres == S_OK, "got %08x\n", hres);

View File

@ -890,7 +890,7 @@ static HRESULT ctl2_set_custdata(
if (guidoffset == -1) return E_OUTOFMEMORY;
dataoffset = ctl2_alloc_custdata(This, pVarVal);
if (dataoffset == -1) return E_OUTOFMEMORY;
if (dataoffset == -2) return E_INVALIDARG;
if (dataoffset == -2) return DISP_E_BADVARTYPE;
custoffset = ctl2_alloc_segment(This, MSFT_SEG_CUSTDATAGUID, 12, 0);
if (custoffset == -1) return E_OUTOFMEMORY;
@ -2709,8 +2709,14 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetCustData(
REFGUID guid, /* [I] The GUID used as a key to retrieve the custom data. */
VARIANT* pVarVal) /* [I] The custom data. */
{
FIXME("(%p,%s,%p), stub!\n", iface, debugstr_guid(guid), pVarVal);
return E_OUTOFMEMORY;
ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
TRACE("(%p,%s,%p)!\n", iface, debugstr_guid(guid), pVarVal);
if (!pVarVal)
return E_INVALIDARG;
return ctl2_set_custdata(This->typelib, guid, pVarVal, &This->typeinfo->oCustData);
}
/******************************************************************************