oleaut32: Added ICreateTypeInfo2::DeleteFuncDesc().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e26d6da8a9
commit
e3ef9b5426
|
@ -8241,6 +8241,83 @@ static void test_DeleteImplType(void)
|
||||||
DeleteFileW(filenameW);
|
DeleteFileW(filenameW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_DeleteFuncDesc(void)
|
||||||
|
{
|
||||||
|
OLECHAR interface1W[] = L"interface1";
|
||||||
|
WCHAR filenameW[MAX_PATH], temp_path[MAX_PATH];
|
||||||
|
ICreateTypeInfo2 *createti2;
|
||||||
|
ICreateTypeInfo *createti;
|
||||||
|
ICreateTypeLib2 *createtl;
|
||||||
|
FUNCDESC funcdesc;
|
||||||
|
TYPEATTR *typeattr;
|
||||||
|
ITypeInfo *ti;
|
||||||
|
ITypeLib *tl;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
GetTempPathW(ARRAY_SIZE(temp_path), temp_path);
|
||||||
|
GetTempFileNameW(temp_path, L"tlb", 0, filenameW);
|
||||||
|
|
||||||
|
hr = CreateTypeLib2(SYS_WIN32, filenameW, &createtl);
|
||||||
|
ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
|
||||||
|
ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr);
|
||||||
|
hr = ICreateTypeInfo_QueryInterface(createti, &IID_ICreateTypeInfo2, (void **)&createti2);
|
||||||
|
ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr);
|
||||||
|
ICreateTypeInfo_Release(createti);
|
||||||
|
|
||||||
|
hr = ICreateTypeInfo2_QueryInterface(createti2, &IID_ITypeInfo, (void **)&ti);
|
||||||
|
ok(hr == S_OK, "Failed to get typeinfo, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
memset(&funcdesc, 0, sizeof(FUNCDESC));
|
||||||
|
funcdesc.funckind = FUNC_PUREVIRTUAL;
|
||||||
|
funcdesc.invkind = INVOKE_PROPERTYGET;
|
||||||
|
funcdesc.callconv = CC_STDCALL;
|
||||||
|
funcdesc.elemdescFunc.tdesc.vt = VT_BSTR;
|
||||||
|
U(funcdesc.elemdescFunc).idldesc.wIDLFlags = IDLFLAG_NONE;
|
||||||
|
|
||||||
|
hr = ICreateTypeInfo2_AddFuncDesc(createti2, 0, &funcdesc);
|
||||||
|
ok(hr == S_OK, "Failed to add a funcdesc, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
|
||||||
|
ok(hr == S_OK, "Failed to get type attr, hr %#x.\n", hr);
|
||||||
|
ok(typeattr->cFuncs == 1, "Unexpected cFuncs %u.\n", typeattr->cFuncs);
|
||||||
|
ITypeInfo_ReleaseTypeAttr(ti, typeattr);
|
||||||
|
|
||||||
|
hr = ICreateTypeInfo2_DeleteFuncDesc(createti2, 1);
|
||||||
|
ok(hr == TYPE_E_ELEMENTNOTFOUND, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = ICreateTypeInfo2_DeleteFuncDesc(createti2, 0);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
|
||||||
|
ok(hr == S_OK, "Failed to get type attr, hr %#x.\n", hr);
|
||||||
|
ok(!typeattr->cFuncs, "Unexpected cFuncs %u.\n", typeattr->cFuncs);
|
||||||
|
ITypeInfo_ReleaseTypeAttr(ti, typeattr);
|
||||||
|
|
||||||
|
hr = ICreateTypeLib2_SaveAllChanges(createtl);
|
||||||
|
ok(hr == S_OK, "Failed to save changes, hr %#x.\n", hr);
|
||||||
|
ICreateTypeLib2_Release(createtl);
|
||||||
|
ITypeInfo_Release(ti);
|
||||||
|
ICreateTypeInfo2_Release(createti2);
|
||||||
|
|
||||||
|
/* Load and check typeinfo. */
|
||||||
|
hr = LoadTypeLibEx(filenameW, REGKIND_NONE, &tl);
|
||||||
|
ok(hr == S_OK, "Failed to load typelib, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = ITypeLib_GetTypeInfo(tl, 0, &ti);
|
||||||
|
ok(hr == S_OK, "Failed to get typeinfo, hr %#x.\n", hr);
|
||||||
|
hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
|
||||||
|
ok(hr == S_OK, "Failed to get type attr, hr %#x.\n", hr);
|
||||||
|
ok(!typeattr->cFuncs, "Unexpected cFuncs value.\n");
|
||||||
|
ITypeInfo_ReleaseTypeAttr(ti, typeattr);
|
||||||
|
ITypeInfo_Release(ti);
|
||||||
|
|
||||||
|
ITypeLib_Release(tl);
|
||||||
|
|
||||||
|
DeleteFileW(filenameW);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(typelib)
|
START_TEST(typelib)
|
||||||
{
|
{
|
||||||
const WCHAR *filename;
|
const WCHAR *filename;
|
||||||
|
@ -8282,4 +8359,5 @@ START_TEST(typelib)
|
||||||
test_stub();
|
test_stub();
|
||||||
test_dep();
|
test_dep();
|
||||||
test_DeleteImplType();
|
test_DeleteImplType();
|
||||||
|
test_DeleteFuncDesc();
|
||||||
}
|
}
|
||||||
|
|
|
@ -5587,6 +5587,22 @@ static ULONG WINAPI ITypeInfo_fnAddRef( ITypeInfo2 *iface)
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void typeinfo_release_funcdesc(TLBFuncDesc *func)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < func->funcdesc.cParams; ++i)
|
||||||
|
{
|
||||||
|
ELEMDESC *elemdesc = &func->funcdesc.lprgelemdescParam[i];
|
||||||
|
if (elemdesc->u.paramdesc.wParamFlags & PARAMFLAG_FHASDEFAULT)
|
||||||
|
VariantClear(&elemdesc->u.paramdesc.pparamdescex->varDefaultValue);
|
||||||
|
TLB_FreeCustData(&func->pParamDesc[i].custdata_list);
|
||||||
|
}
|
||||||
|
heap_free(func->funcdesc.lprgelemdescParam);
|
||||||
|
heap_free(func->pParamDesc);
|
||||||
|
TLB_FreeCustData(&func->custdata_list);
|
||||||
|
}
|
||||||
|
|
||||||
static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This)
|
static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This)
|
||||||
{
|
{
|
||||||
UINT i;
|
UINT i;
|
||||||
|
@ -5595,18 +5611,7 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This)
|
||||||
|
|
||||||
for (i = 0; i < This->typeattr.cFuncs; ++i)
|
for (i = 0; i < This->typeattr.cFuncs; ++i)
|
||||||
{
|
{
|
||||||
int j;
|
typeinfo_release_funcdesc(&This->funcdescs[i]);
|
||||||
TLBFuncDesc *pFInfo = &This->funcdescs[i];
|
|
||||||
for(j = 0; j < pFInfo->funcdesc.cParams; j++)
|
|
||||||
{
|
|
||||||
ELEMDESC *elemdesc = &pFInfo->funcdesc.lprgelemdescParam[j];
|
|
||||||
if (elemdesc->u.paramdesc.wParamFlags & PARAMFLAG_FHASDEFAULT)
|
|
||||||
VariantClear(&elemdesc->u.paramdesc.pparamdescex->varDefaultValue);
|
|
||||||
TLB_FreeCustData(&pFInfo->pParamDesc[j].custdata_list);
|
|
||||||
}
|
|
||||||
heap_free(pFInfo->funcdesc.lprgelemdescParam);
|
|
||||||
heap_free(pFInfo->pParamDesc);
|
|
||||||
TLB_FreeCustData(&pFInfo->custdata_list);
|
|
||||||
}
|
}
|
||||||
heap_free(This->funcdescs);
|
heap_free(This->funcdescs);
|
||||||
|
|
||||||
|
@ -11373,8 +11378,27 @@ static HRESULT WINAPI ICreateTypeInfo2_fnDeleteFuncDesc(ICreateTypeInfo2 *iface,
|
||||||
UINT index)
|
UINT index)
|
||||||
{
|
{
|
||||||
ITypeInfoImpl *This = info_impl_from_ICreateTypeInfo2(iface);
|
ITypeInfoImpl *This = info_impl_from_ICreateTypeInfo2(iface);
|
||||||
FIXME("%p %u - stub\n", This, index);
|
unsigned int i;
|
||||||
return E_NOTIMPL;
|
|
||||||
|
TRACE("%p %u\n", This, index);
|
||||||
|
|
||||||
|
if (index >= This->typeattr.cFuncs)
|
||||||
|
return TYPE_E_ELEMENTNOTFOUND;
|
||||||
|
|
||||||
|
typeinfo_release_funcdesc(&This->funcdescs[index]);
|
||||||
|
|
||||||
|
--This->typeattr.cFuncs;
|
||||||
|
if (index != This->typeattr.cFuncs)
|
||||||
|
{
|
||||||
|
memmove(This->funcdescs + index, This->funcdescs + index + 1,
|
||||||
|
sizeof(*This->funcdescs) * (This->typeattr.cFuncs - index));
|
||||||
|
for (i = index; i < This->typeattr.cFuncs; ++i)
|
||||||
|
TLB_relink_custdata(&This->funcdescs[i].custdata_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
This->needs_layout = TRUE;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI ICreateTypeInfo2_fnDeleteFuncDescByMemId(ICreateTypeInfo2 *iface,
|
static HRESULT WINAPI ICreateTypeInfo2_fnDeleteFuncDescByMemId(ICreateTypeInfo2 *iface,
|
||||||
|
|
Loading…
Reference in New Issue