Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 64 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 19c23a1..73c7a4c 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -539,6 +539,7 @@ typedef struct { ITypeInfo ITypeInfo_iface; ITypeComp ITypeComp_iface; ITypeLib typelib_ITypeLib_iface; + ITypeComp typelib_ITypeComp_iface; LONG ref;
UINT num_vars; @@ -583,6 +584,11 @@ static inline ScriptTypeInfo *ScriptTypeInfo_from_typelib_ITypeLib(ITypeLib *ifa return CONTAINING_RECORD(iface, ScriptTypeInfo, typelib_ITypeLib_iface); }
+static inline ScriptTypeInfo *ScriptTypeInfo_from_typelib_ITypeComp(ITypeComp *iface) +{ + return CONTAINING_RECORD(iface, ScriptTypeInfo, typelib_ITypeComp_iface); +} + static HRESULT WINAPI ScriptTypeInfo_QueryInterface(ITypeInfo *iface, REFIID riid, void **ppv) { ScriptTypeInfo *This = ScriptTypeInfo_from_ITypeInfo(iface); @@ -1219,6 +1225,8 @@ static HRESULT WINAPI ScriptTypeLib_QueryInterface(ITypeLib *iface, REFIID riid,
if (IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ITypeLib, riid)) *ppv = &This->typelib_ITypeLib_iface; + else if (IsEqualGUID(&IID_ITypeComp, riid)) + *ppv = &This->typelib_ITypeComp_iface; else { WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); @@ -1323,9 +1331,13 @@ static HRESULT WINAPI ScriptTypeLib_GetTypeComp(ITypeLib *iface, ITypeComp **ppT { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface);
- FIXME("(%p)->(%p)\n", This, ppTComp); + TRACE("(%p)->(%p)\n", This, ppTComp);
- return E_NOTIMPL; + if (!ppTComp) return E_INVALIDARG; + + *ppTComp = &This->typelib_ITypeComp_iface; + ITypeLib_AddRef(iface); + return S_OK; }
static HRESULT WINAPI ScriptTypeLib_GetDocumentation(ITypeLib *iface, INT index, BSTR *pBstrName, @@ -1383,6 +1395,53 @@ static const ITypeLibVtbl ScriptTypeLibVtbl = { ScriptTypeLib_ReleaseTLibAttr };
+static HRESULT WINAPI ScriptTypeLibComp_QueryInterface(ITypeComp *iface, REFIID riid, void **ppv) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeComp(iface); + return ITypeLib_QueryInterface(&This->typelib_ITypeLib_iface, riid, ppv); +} + +static ULONG WINAPI ScriptTypeLibComp_AddRef(ITypeComp *iface) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeComp(iface); + return ITypeLib_AddRef(&This->typelib_ITypeLib_iface); +} + +static ULONG WINAPI ScriptTypeLibComp_Release(ITypeComp *iface) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeComp(iface); + return ITypeLib_Release(&This->typelib_ITypeLib_iface); +} + +static HRESULT WINAPI ScriptTypeLibComp_Bind(ITypeComp *iface, LPOLESTR szName, ULONG lHashVal, WORD wFlags, + ITypeInfo **ppTInfo, DESCKIND *pDescKind, BINDPTR *pBindPtr) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeComp(iface); + + FIXME("(%p)->(%s %08x %d %p %p %p)\n", This, debugstr_w(szName), lHashVal, + wFlags, ppTInfo, pDescKind, pBindPtr); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ScriptTypeLibComp_BindType(ITypeComp *iface, LPOLESTR szName, ULONG lHashVal, + ITypeInfo **ppTInfo, ITypeComp **ppTComp) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeComp(iface); + + FIXME("(%p)->(%s %08x %p %p)\n", This, debugstr_w(szName), lHashVal, ppTInfo, ppTComp); + + return E_NOTIMPL; +} + +static const ITypeCompVtbl ScriptTypeLibCompVtbl = { + ScriptTypeLibComp_QueryInterface, + ScriptTypeLibComp_AddRef, + ScriptTypeLibComp_Release, + ScriptTypeLibComp_Bind, + ScriptTypeLibComp_BindType +}; + static inline ScriptDisp *ScriptDisp_from_IDispatchEx(IDispatchEx *iface) { return CONTAINING_RECORD(iface, ScriptDisp, IDispatchEx_iface); @@ -1476,6 +1535,7 @@ static HRESULT WINAPI ScriptDisp_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, LC type_info->ITypeInfo_iface.lpVtbl = &ScriptTypeInfoVtbl; type_info->ITypeComp_iface.lpVtbl = &ScriptTypeCompVtbl; type_info->typelib_ITypeLib_iface.lpVtbl = &ScriptTypeLibVtbl; + type_info->typelib_ITypeComp_iface.lpVtbl = &ScriptTypeLibCompVtbl; type_info->ref = 1; type_info->num_funcs = num_funcs; type_info->num_vars = This->global_vars_cnt;