Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 153 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index c14cd7b..ed21a04 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -537,6 +537,7 @@ struct typeinfo_func { typedef struct { ITypeInfo ITypeInfo_iface; ITypeComp ITypeComp_iface; + ITypeLib typelib_ITypeLib_iface; LONG ref;
UINT num_vars; @@ -576,6 +577,11 @@ static inline ScriptTypeInfo *ScriptTypeInfo_from_ITypeComp(ITypeComp *iface) return CONTAINING_RECORD(iface, ScriptTypeInfo, ITypeComp_iface); }
+static inline ScriptTypeInfo *ScriptTypeInfo_from_typelib_ITypeLib(ITypeLib *iface) +{ + return CONTAINING_RECORD(iface, ScriptTypeInfo, typelib_ITypeLib_iface); +} + static HRESULT WINAPI ScriptTypeInfo_QueryInterface(ITypeInfo *iface, REFIID riid, void **ppv) { ScriptTypeInfo *This = ScriptTypeInfo_from_ITypeInfo(iface); @@ -1037,9 +1043,14 @@ static HRESULT WINAPI ScriptTypeInfo_GetContainingTypeLib(ITypeInfo *iface, ITyp { ScriptTypeInfo *This = ScriptTypeInfo_from_ITypeInfo(iface);
- FIXME("(%p)->(%p %p)\n", This, ppTLib, pIndex); + TRACE("(%p)->(%p %p)\n", This, ppTLib, pIndex);
- return E_NOTIMPL; + if (pIndex) *pIndex = 0; + if (!ppTLib) return S_OK; + + *ppTLib = &This->typelib_ITypeLib_iface; + ITypeInfo_AddRef(&This->ITypeInfo_iface); + return S_OK; }
static void WINAPI ScriptTypeInfo_ReleaseTypeAttr(ITypeInfo *iface, TYPEATTR *pTypeAttr) @@ -1201,6 +1212,143 @@ static const ITypeCompVtbl ScriptTypeCompVtbl = { ScriptTypeComp_BindType };
+static HRESULT WINAPI ScriptTypeLib_QueryInterface(ITypeLib *iface, REFIID riid, void **ppv) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + if (IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ITypeLib, riid)) + *ppv = &This->typelib_ITypeLib_iface; + else + { + WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; + } + + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI ScriptTypeLib_AddRef(ITypeLib *iface) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + return ITypeInfo_AddRef(&This->ITypeInfo_iface); +} + +static ULONG WINAPI ScriptTypeLib_Release(ITypeLib *iface) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + return ITypeInfo_Release(&This->ITypeInfo_iface); +} + +static UINT WINAPI ScriptTypeLib_GetTypeInfoCount(ITypeLib *iface) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + TRACE("(%p)\n", This); + + return 1; +} + +static HRESULT WINAPI ScriptTypeLib_GetTypeInfo(ITypeLib *iface, UINT index, ITypeInfo **ppTInfo) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%u %p)\n", This, index, ppTInfo); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ScriptTypeLib_GetTypeInfoType(ITypeLib *iface, UINT index, TYPEKIND *pTKind) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%u %p)\n", This, index, pTKind); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ScriptTypeLib_GetTypeInfoOfGuid(ITypeLib *iface, REFGUID guid, ITypeInfo **ppTinfo) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%s %p)\n", This, debugstr_guid(guid), ppTinfo); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ScriptTypeLib_GetLibAttr(ITypeLib *iface, TLIBATTR **ppTLibAttr) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%p)\n", This, ppTLibAttr); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ScriptTypeLib_GetTypeComp(ITypeLib *iface, ITypeComp **ppTComp) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%p)\n", This, ppTComp); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ScriptTypeLib_GetDocumentation(ITypeLib *iface, INT index, BSTR *pBstrName, + BSTR *pBstrDocString, DWORD *pdwHelpContext, BSTR *pBstrHelpFile) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%d %p %p %p %p)\n", This, index, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ScriptTypeLib_IsName(ITypeLib *iface, LPOLESTR szNameBuf, ULONG lHashVal, BOOL *pfName) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%s %08x %p)\n", This, debugstr_w(szNameBuf), lHashVal, pfName); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ScriptTypeLib_FindName(ITypeLib *iface, LPOLESTR szNameBuf, ULONG lHashVal, + ITypeInfo **ppTInfo, MEMBERID *rgMemId, USHORT *pcFound) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%s %08x %p %p %p)\n", This, debugstr_w(szNameBuf), lHashVal, + ppTInfo, rgMemId, pcFound); + + return E_NOTIMPL; +} + +static void WINAPI ScriptTypeLib_ReleaseTLibAttr(ITypeLib *iface, TLIBATTR *pTLibAttr) +{ + ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + + FIXME("(%p)->(%p)\n", This, pTLibAttr); +} + +static const ITypeLibVtbl ScriptTypeLibVtbl = { + ScriptTypeLib_QueryInterface, + ScriptTypeLib_AddRef, + ScriptTypeLib_Release, + ScriptTypeLib_GetTypeInfoCount, + ScriptTypeLib_GetTypeInfo, + ScriptTypeLib_GetTypeInfoType, + ScriptTypeLib_GetTypeInfoOfGuid, + ScriptTypeLib_GetLibAttr, + ScriptTypeLib_GetTypeComp, + ScriptTypeLib_GetDocumentation, + ScriptTypeLib_IsName, + ScriptTypeLib_FindName, + ScriptTypeLib_ReleaseTLibAttr +}; + static inline ScriptDisp *ScriptDisp_from_IDispatchEx(IDispatchEx *iface) { return CONTAINING_RECORD(iface, ScriptDisp, IDispatchEx_iface); @@ -1293,6 +1441,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->ref = 1; type_info->num_funcs = num_funcs; type_info->num_vars = This->global_vars_cnt;