Kevin Puetz : oleaut32: Make GetNames omit same parameters as GetFuncDesc.
Alexandre Julliard
julliard at winehq.org
Mon Sep 28 14:49:25 CDT 2020
Module: wine
Branch: master
Commit: 477fc581de1196bb8359f7e32bc994e7f355ac79
URL: https://source.winehq.org/git/wine.git/?a=commit;h=477fc581de1196bb8359f7e32bc994e7f355ac79
Author: Kevin Puetz <PuetzKevinA at JohnDeere.com>
Date: Mon Sep 28 10:52:54 2020 +0100
oleaut32: Make GetNames omit same parameters as GetFuncDesc.
GetFuncDesc removes parameters which are handled specially by Invoke;
GetNames should also consistently omit their names.
Signed-off-by: Kevin Puetz <PuetzKevinA at JohnDeere.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/oleaut32/typelib.c | 110 +++++++++++++++++++++++++++++-------------------
1 file changed, 66 insertions(+), 44 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 54d020b7e9..989340de9c 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -6117,76 +6117,98 @@ static HRESULT WINAPI ITypeInfo_fnGetVarDesc( ITypeInfo2 *iface, UINT index,
return TLB_AllocAndInitVarDesc(&pVDesc->vardesc, ppVarDesc);
}
-/* ITypeInfo_GetNames
- *
- * Retrieves the variable with the specified member ID (or the name of the
- * property or method and its parameters) that correspond to the specified
- * function ID.
- */
-static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
- BSTR *rgBstrNames, UINT cMaxNames, UINT *pcNames)
+/* internal function to make the inherited interfaces' methods appear
+ * part of the interface, remembering if the top-level was dispinterface */
+static HRESULT typeinfo_getnames( ITypeInfo *iface, MEMBERID memid, BSTR *names,
+ UINT max_names, UINT *num_names, BOOL dispinterface)
{
- ITypeInfoImpl *This = impl_from_ITypeInfo2(iface);
- const TLBFuncDesc *pFDesc;
- const TLBVarDesc *pVDesc;
+ ITypeInfoImpl *This = impl_from_ITypeInfo(iface);
+ const TLBFuncDesc *func_desc;
+ const TLBVarDesc *var_desc;
int i;
- TRACE("(%p) memid=0x%08x Maxname=%d\n", This, memid, cMaxNames);
- if(!rgBstrNames)
- return E_INVALIDARG;
+ *num_names = 0;
- *pcNames = 0;
-
- pFDesc = TLB_get_funcdesc_by_memberid(This, memid);
- if(pFDesc)
+ func_desc = TLB_get_funcdesc_by_memberid(This, memid);
+ if (func_desc)
{
- if(!cMaxNames || !pFDesc->Name)
+ UINT params = func_desc->funcdesc.cParams;
+ if (!max_names || !func_desc->Name)
return S_OK;
- *rgBstrNames = SysAllocString(TLB_get_bstr(pFDesc->Name));
- ++(*pcNames);
+ *names = SysAllocString(TLB_get_bstr(func_desc->Name));
+ ++(*num_names);
+
+ if (dispinterface && (func_desc->funcdesc.funckind != FUNC_DISPATCH))
+ {
+ /* match the rewriting of special trailing parameters in TLB_AllocAndInitFuncDesc */
+ if ((params > 0) && (func_desc->funcdesc.lprgelemdescParam[params - 1].u.paramdesc.wParamFlags & PARAMFLAG_FRETVAL))
+ --params; /* Invoke(pVarResult) supplies the [retval] parameter, so it's hidden from DISPPARAMS */
+ if ((params > 0) && (func_desc->funcdesc.lprgelemdescParam[params - 1].u.paramdesc.wParamFlags & PARAMFLAG_FLCID))
+ --params; /* Invoke(lcid) supplies the [lcid] parameter, so it's hidden from DISPPARAMS */
+ }
- for(i = 0; i < pFDesc->funcdesc.cParams; ++i){
- if(*pcNames >= cMaxNames || !pFDesc->pParamDesc[i].Name)
+ for (i = 0; i < params; i++)
+ {
+ if (*num_names >= max_names || !func_desc->pParamDesc[i].Name)
return S_OK;
- rgBstrNames[*pcNames] = SysAllocString(TLB_get_bstr(pFDesc->pParamDesc[i].Name));
- ++(*pcNames);
+ names[*num_names] = SysAllocString(TLB_get_bstr(func_desc->pParamDesc[i].Name));
+ ++(*num_names);
}
return S_OK;
}
- pVDesc = TLB_get_vardesc_by_memberid(This, memid);
- if(pVDesc)
+ var_desc = TLB_get_vardesc_by_memberid(This, memid);
+ if (var_desc)
{
- *rgBstrNames=SysAllocString(TLB_get_bstr(pVDesc->Name));
- *pcNames=1;
+ *names = SysAllocString(TLB_get_bstr(var_desc->Name));
+ *num_names = 1;
}
else
{
- if(This->impltypes &&
- (This->typeattr.typekind == TKIND_INTERFACE || This->typeattr.typekind == TKIND_DISPATCH)) {
- /* recursive search */
- ITypeInfo *pTInfo;
- HRESULT result;
- result = ITypeInfo2_GetRefTypeInfo(iface, This->impltypes[0].hRef, &pTInfo);
- if(SUCCEEDED(result))
- {
- result=ITypeInfo_GetNames(pTInfo, memid, rgBstrNames, cMaxNames, pcNames);
- ITypeInfo_Release(pTInfo);
- return result;
- }
- WARN("Could not search inherited interface!\n");
+ if (This->impltypes &&
+ (This->typeattr.typekind == TKIND_INTERFACE || This->typeattr.typekind == TKIND_DISPATCH))
+ {
+ /* recursive search */
+ ITypeInfo *parent;
+ HRESULT result;
+ result = ITypeInfo_GetRefTypeInfo(iface, This->impltypes[0].hRef, &parent);
+ if (SUCCEEDED(result))
+ {
+ result = typeinfo_getnames(parent, memid, names, max_names, num_names, dispinterface);
+ ITypeInfo_Release(parent);
+ return result;
+ }
+ WARN("Could not search inherited interface!\n");
}
else
{
- WARN("no names found\n");
+ WARN("no names found\n");
}
- *pcNames=0;
+ *num_names = 0;
return TYPE_E_ELEMENTNOTFOUND;
}
return S_OK;
}
+/* ITypeInfo_GetNames
+ *
+ * Retrieves the variable with the specified member ID (or the name of the
+ * property or method and its parameters) that correspond to the specified
+ * function ID.
+ */
+static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
+ BSTR *names, UINT max_names, UINT *num_names)
+{
+ ITypeInfoImpl *This = impl_from_ITypeInfo2(iface);
+
+ TRACE("(%p) memid 0x%08x max_names %d\n", This, memid, max_names);
+
+ if (!names) return E_INVALIDARG;
+
+ return typeinfo_getnames((ITypeInfo *)iface, memid, names, max_names, num_names,
+ This->typeattr.typekind == TKIND_DISPATCH);
+}
/* ITypeInfo::GetRefTypeOfImplType
*
More information about the wine-cvs
mailing list