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;
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index ed21a04..e8b976b 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -1255,9 +1255,14 @@ static HRESULT WINAPI ScriptTypeLib_GetTypeInfo(ITypeLib *iface, UINT index, ITy { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface);
- FIXME("(%p)->(%u %p)\n", This, index, ppTInfo); + TRACE("(%p)->(%u %p)\n", This, index, ppTInfo);
- return E_NOTIMPL; + if (!ppTInfo) return E_INVALIDARG; + if (index) return TYPE_E_ELEMENTNOTFOUND; + + *ppTInfo = &This->ITypeInfo_iface; + ITypeInfo_AddRef(*ppTInfo); + return S_OK; }
static HRESULT WINAPI ScriptTypeLib_GetTypeInfoType(ITypeLib *iface, UINT index, TYPEKIND *pTKind)
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index e8b976b..2b884cb 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -1269,9 +1269,13 @@ static HRESULT WINAPI ScriptTypeLib_GetTypeInfoType(ITypeLib *iface, UINT index, { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface);
- FIXME("(%p)->(%u %p)\n", This, index, pTKind); + TRACE("(%p)->(%u %p)\n", This, index, pTKind);
- return E_NOTIMPL; + if (!pTKind) return E_INVALIDARG; + if (index) return TYPE_E_ELEMENTNOTFOUND; + + *pTKind = TKIND_DISPATCH; + return S_OK; }
static HRESULT WINAPI ScriptTypeLib_GetTypeInfoOfGuid(ITypeLib *iface, REFGUID guid, ITypeInfo **ppTinfo)
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 2b884cb..82c739e 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -1282,9 +1282,17 @@ static HRESULT WINAPI ScriptTypeLib_GetTypeInfoOfGuid(ITypeLib *iface, REFGUID g { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface);
- FIXME("(%p)->(%s %p)\n", This, debugstr_guid(guid), ppTinfo); + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(guid), ppTinfo);
- return E_NOTIMPL; + if (!ppTinfo) return S_OK; + + *ppTinfo = NULL; + if (IsEqualGUID(&GUID_VBScriptTypeInfo, guid)) + { + *ppTinfo = &This->ITypeInfo_iface; + ITypeInfo_AddRef(*ppTinfo); + } + return S_OK; }
static HRESULT WINAPI ScriptTypeLib_GetLibAttr(ITypeLib *iface, TLIBATTR **ppTLibAttr)
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 82c739e..19c23a1 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -24,6 +24,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
+static const GUID GUID_VBScriptTypeLib = {0xc59c6b11,0xf6c1,0x11cf,{0x88,0x35,0x00,0xa0,0xc9,0x11,0xe8,0xb2}}; static const GUID GUID_VBScriptTypeInfo = {0xc59c6b12,0xf6c1,0x11cf,{0x88,0x35,0x00,0xa0,0xc9,0x11,0xe8,0xb2}};
#define DISPID_FUNCTION_MASK 0x20000000 @@ -1298,10 +1299,24 @@ static HRESULT WINAPI ScriptTypeLib_GetTypeInfoOfGuid(ITypeLib *iface, REFGUID g static HRESULT WINAPI ScriptTypeLib_GetLibAttr(ITypeLib *iface, TLIBATTR **ppTLibAttr) { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + TLIBATTR *attr;
- FIXME("(%p)->(%p)\n", This, ppTLibAttr); + TRACE("(%p)->(%p)\n", This, ppTLibAttr);
- return E_NOTIMPL; + if (!ppTLibAttr) return E_INVALIDARG; + + attr = heap_alloc(sizeof(*attr)); + if (!attr) return E_OUTOFMEMORY; + + attr->guid = GUID_VBScriptTypeLib; + attr->lcid = LOCALE_USER_DEFAULT; + attr->syskind = SYS_WIN32; + attr->wMajorVerNum = VBSCRIPT_MAJOR_VERSION; + attr->wMinorVerNum = VBSCRIPT_MINOR_VERSION; + attr->wLibFlags = 0; + + *ppTLibAttr = attr; + return S_OK; }
static HRESULT WINAPI ScriptTypeLib_GetTypeComp(ITypeLib *iface, ITypeComp **ppTComp) @@ -1347,7 +1362,9 @@ static void WINAPI ScriptTypeLib_ReleaseTLibAttr(ITypeLib *iface, TLIBATTR *pTLi { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface);
- FIXME("(%p)->(%p)\n", This, pTLibAttr); + TRACE("(%p)->(%p)\n", This, pTLibAttr); + + heap_free(pTLibAttr); }
static const ITypeLibVtbl ScriptTypeLibVtbl = {
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;
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 73c7a4c..be11277 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -1418,10 +1418,16 @@ static HRESULT WINAPI ScriptTypeLibComp_Bind(ITypeComp *iface, LPOLESTR szName, { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeComp(iface);
- FIXME("(%p)->(%s %08x %d %p %p %p)\n", This, debugstr_w(szName), lHashVal, + TRACE("(%p)->(%s %08x %d %p %p %p)\n", This, debugstr_w(szName), lHashVal, wFlags, ppTInfo, pDescKind, pBindPtr);
- return E_NOTIMPL; + if (!szName || !ppTInfo || !pDescKind || !pBindPtr) + return E_INVALIDARG; + + *ppTInfo = NULL; + *pDescKind = DESCKIND_NONE; + pBindPtr->lptcomp = NULL; + return S_OK; }
static HRESULT WINAPI ScriptTypeLibComp_BindType(ITypeComp *iface, LPOLESTR szName, ULONG lHashVal,
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index be11277..56a8fe8 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -1435,9 +1435,21 @@ static HRESULT WINAPI ScriptTypeLibComp_BindType(ITypeComp *iface, LPOLESTR szNa { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeComp(iface);
- FIXME("(%p)->(%s %08x %p %p)\n", This, debugstr_w(szName), lHashVal, ppTInfo, ppTComp); + TRACE("(%p)->(%s %08x %p %p)\n", This, debugstr_w(szName), lHashVal, ppTInfo, ppTComp);
- return E_NOTIMPL; + if (!szName || !ppTInfo || !ppTComp) + return E_INVALIDARG; + + *ppTInfo = NULL; + *ppTComp = NULL; + + if (!wcsicmp(szName, L"VBScriptTypeInfo")) + { + /* For some reason, Windows does not return the TypeComp here */ + *ppTInfo = &This->ITypeInfo_iface; + ITypeInfo_AddRef(*ppTInfo); + } + return S_OK; }
static const ITypeCompVtbl ScriptTypeLibCompVtbl = {
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 56a8fe8..ef40ee9 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -1345,9 +1345,27 @@ static HRESULT WINAPI ScriptTypeLib_GetDocumentation(ITypeLib *iface, INT index, { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface);
- FIXME("(%p)->(%d %p %p %p %p)\n", This, index, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile); + TRACE("(%p)->(%d %p %p %p %p)\n", This, index, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile);
- return E_NOTIMPL; + if (index == -1) + { + if (pBstrName && !(*pBstrName = SysAllocString(L"VBScriptTypeLib"))) + return STG_E_INSUFFICIENTMEMORY; + if (pBstrDocString && + !(*pBstrDocString = SysAllocString(L"Visual Basic Scripting Type Library"))) + { + if (pBstrName) SysFreeString(*pBstrName); + return STG_E_INSUFFICIENTMEMORY; + } + if (pdwHelpContext) *pdwHelpContext = 0; + if (pBstrHelpFile) *pBstrHelpFile = NULL; + return S_OK; + } + + if (index != 0) return TYPE_E_ELEMENTNOTFOUND; + + return ITypeInfo_GetDocumentation(&This->ITypeInfo_iface, MEMBERID_NIL, pBstrName, + pBstrDocString, pdwHelpContext, pBstrHelpFile); }
static HRESULT WINAPI ScriptTypeLib_IsName(ITypeLib *iface, LPOLESTR szNameBuf, ULONG lHashVal, BOOL *pfName)
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
This function, and IsName, change the input name parameter's case to match that of the one found.
dlls/vbscript/vbdisp.c | 50 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index ef40ee9..bae5f42 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -1381,11 +1381,57 @@ static HRESULT WINAPI ScriptTypeLib_FindName(ITypeLib *iface, LPOLESTR szNameBuf ITypeInfo **ppTInfo, MEMBERID *rgMemId, USHORT *pcFound) { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + UINT cnt, i;
- FIXME("(%p)->(%s %08x %p %p %p)\n", This, debugstr_w(szNameBuf), lHashVal, + TRACE("(%p)->(%s %08x %p %p %p)\n", This, debugstr_w(szNameBuf), lHashVal, ppTInfo, rgMemId, pcFound);
- return E_NOTIMPL; + if (!szNameBuf || !ppTInfo || !rgMemId || !pcFound) + return E_INVALIDARG; + + cnt = *pcFound; + *pcFound = 0; + if (!cnt) return S_OK; + + if (!wcsicmp(szNameBuf, L"VBScriptTypeInfo")) + { + /* Make sure to capitalize the name as it is found */ + lstrcpyW(szNameBuf, L"VBScriptTypeInfo"); + *rgMemId++ = MEMBERID_NIL; + *ppTInfo++ = &This->ITypeInfo_iface; + ITypeInfo_AddRef(&This->ITypeInfo_iface); + (*pcFound)++; + if (cnt == 1) + return S_OK; + } + + for (i = 0; i < This->num_funcs; i++) + { + if (!wcsicmp(szNameBuf, This->funcs[i].func->name)) + { + lstrcpyW(szNameBuf, This->funcs[i].func->name); + *rgMemId++ = This->funcs[i].memid; + *ppTInfo++ = &This->ITypeInfo_iface; + ITypeInfo_AddRef(&This->ITypeInfo_iface); + (*pcFound)++; + return S_OK; + } + } + + for (i = 0; i < This->num_vars; i++) + { + if (!wcsicmp(szNameBuf, This->disp->global_vars[i]->name)) + { + lstrcpyW(szNameBuf, This->disp->global_vars[i]->name); + *rgMemId++ = i + 1; + *ppTInfo++ = &This->ITypeInfo_iface; + ITypeInfo_AddRef(&This->ITypeInfo_iface); + (*pcFound)++; + return S_OK; + } + } + + return S_OK; }
static void WINAPI ScriptTypeLib_ReleaseTLibAttr(ITypeLib *iface, TLIBATTR *pTLibAttr)
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/vbdisp.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index bae5f42..84f639e 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -1371,10 +1371,26 @@ static HRESULT WINAPI ScriptTypeLib_GetDocumentation(ITypeLib *iface, INT index, static HRESULT WINAPI ScriptTypeLib_IsName(ITypeLib *iface, LPOLESTR szNameBuf, ULONG lHashVal, BOOL *pfName) { ScriptTypeInfo *This = ScriptTypeInfo_from_typelib_ITypeLib(iface); + ITypeInfo *typeinfo; + MEMBERID memid; + USHORT cnt = 1; + HRESULT hr;
- FIXME("(%p)->(%s %08x %p)\n", This, debugstr_w(szNameBuf), lHashVal, pfName); + TRACE("(%p)->(%s %08x %p)\n", This, debugstr_w(szNameBuf), lHashVal, pfName);
- return E_NOTIMPL; + if (!szNameBuf || !pfName) return E_INVALIDARG; + + hr = ITypeLib_FindName(iface, szNameBuf, lHashVal, &typeinfo, &memid, &cnt); + if (FAILED(hr)) return hr; + + if (!cnt) + *pfName = FALSE; + else + { + *pfName = TRUE; + ITypeInfo_Release(typeinfo); + } + return S_OK; }
static HRESULT WINAPI ScriptTypeLib_FindName(ITypeLib *iface, LPOLESTR szNameBuf, ULONG lHashVal,
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/tests/vbscript.c | 158 +++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+)
diff --git a/dlls/vbscript/tests/vbscript.c b/dlls/vbscript/tests/vbscript.c index f0b75ad..5b35ca8 100644 --- a/dlls/vbscript/tests/vbscript.c +++ b/dlls/vbscript/tests/vbscript.c @@ -51,6 +51,7 @@ #endif
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); +DEFINE_GUID(IID_IScriptTypeLib, 0xc59c6b11, 0xf6c1, 0x11cf, 0x88,0x35, 0x00,0xa0,0xc9,0x11,0xe8,0xb2); DEFINE_GUID(IID_IScriptTypeInfo, 0xc59c6b12, 0xf6c1, 0x11cf, 0x88,0x35, 0x00,0xa0,0xc9,0x11,0xe8,0xb2);
#define DEFINE_EXPECT(func) \ @@ -892,13 +893,18 @@ static void test_script_typeinfo(void) IActiveScript *vbscript; FUNCDESC *funcdesc; VARDESC *vardesc; + ITypeLib *typelib; + TLIBATTR *libattr; DESCKIND desckind; + TYPEKIND typekind; INT implTypeFlags; UINT count, index; HREFTYPE reftype; BINDPTR bindptr; MEMBERID memid; TYPEATTR *attr; + USHORT found; + BOOL boolean; HRESULT hr; WCHAR str[64], *names = str; BSTR bstr, bstrs[5]; @@ -1254,6 +1260,158 @@ static void test_script_typeinfo(void)
ITypeComp_Release(typecomp);
+ /* Check the TypeLib */ + hr = IDispatchEx_QueryInterface(script_disp, &IID_ITypeLib, (void**)&typelib); + ok(hr == E_NOINTERFACE, "QueryInterface(IID_ITypeLib) returned: %08x\n", hr); + hr = ITypeInfo_GetContainingTypeLib(typeinfo, NULL, &index); + ok(hr == S_OK, "GetContainingTypeLib failed: %08x\n", hr); + ok(index == 0, "Unexpected index %u\n", index); + hr = ITypeInfo_GetContainingTypeLib(typeinfo, &typelib, NULL); + ok(hr == S_OK, "GetContainingTypeLib failed: %08x\n", hr); + + hr = ITypeLib_GetDocumentation(typelib, 1337, NULL, NULL, NULL, NULL); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetDocumentation(1337) returned: %08x\n", hr); + hr = ITypeLib_GetDocumentation(typelib, -1, &bstr, NULL, NULL, NULL); + ok(hr == S_OK, "GetDocumentation(-1) failed: %08x\n", hr); + ok(!lstrcmpW(bstr, L"VBScriptTypeLib"), "Unexpected TypeLib name %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + hr = ITypeLib_GetDocumentation(typelib, 0, &bstr, NULL, NULL, NULL); + ok(hr == S_OK, "GetDocumentation(0) failed: %08x\n", hr); + ok(!lstrcmpW(bstr, L"VBScriptTypeInfo"), "Unexpected TypeInfo name %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + hr = ITypeLib_GetLibAttr(typelib, NULL); + ok(hr == E_INVALIDARG, "GetLibAttr returned: %08x\n", hr); + hr = ITypeLib_GetLibAttr(typelib, &libattr); + ok(hr == S_OK, "GetLibAttr failed: %08x\n", hr); + ok(IsEqualGUID(&libattr->guid, &IID_IScriptTypeLib), "Unexpected GUID %s\n", wine_dbgstr_guid(&libattr->guid)); + ok(libattr->lcid == LOCALE_USER_DEFAULT, "Unexpected LCID %u\n", libattr->lcid); + ok(libattr->syskind == SYS_WIN32, "Unexpected syskind %u\n", libattr->syskind); + ok(libattr->wLibFlags == 0, "Unexpected wLibFlags 0x%x\n", libattr->wLibFlags); + ITypeLib_ReleaseTLibAttr(typelib, libattr); + + hr = ITypeLib_GetTypeInfoType(typelib, index, NULL); + ok(hr == E_INVALIDARG, "GetTypeInfoType returned: %08x\n", hr); + hr = ITypeLib_GetTypeInfoType(typelib, 1337, &typekind); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetTypeInfoType returned: %08x\n", hr); + hr = ITypeLib_GetTypeInfoType(typelib, index, &typekind); + ok(hr == S_OK, "GetTypeInfoType failed: %08x\n", hr); + ok(typekind == TKIND_DISPATCH, "Unexpected typekind %u\n", typekind); + + count = ITypeLib_GetTypeInfoCount(typelib); + ok(count == 1, "Unexpected TypeInfo count %u\n", count); + + ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IScriptTypeInfo, NULL); + ok(hr == S_OK, "GetTypeInfoOfGuid failed: %08x\n", hr); + typeinfo2 = (ITypeInfo*)0xdeadbeef; + ITypeLib_GetTypeInfoOfGuid(typelib, &GUID_NULL, &typeinfo2); + ok(hr == S_OK, "GetTypeInfoOfGuid returned: %08x\n", hr); + ok(!typeinfo2, "Unexpected TypeInfo %p\n", typeinfo2); + ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IScriptTypeInfo, &typeinfo2); + ok(hr == S_OK, "GetTypeInfoOfGuid failed: %08x\n", hr); + ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo); + ITypeInfo_Release(typeinfo2); + + hr = ITypeLib_GetTypeInfo(typelib, index, NULL); + ok(hr == E_INVALIDARG, "GetTypeInfo returned: %08x\n", hr); + hr = ITypeLib_GetTypeInfo(typelib, 1337, &typeinfo2); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetTypeInfo returned: %08x\n", hr); + hr = ITypeLib_GetTypeInfo(typelib, index, &typeinfo2); + ok(hr == S_OK, "GetTypeInfo failed: %08x\n", hr); + ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo); + ITypeInfo_Release(typeinfo2); + + found = 1; + wcscpy(str, L"not_found"); + hr = ITypeLib_FindName(typelib, NULL, 0, &typeinfo2, &memid, &found); + ok(hr == E_INVALIDARG, "FindName(not_found, null name) returned: %08x\n", hr); + hr = ITypeLib_FindName(typelib, str, 0, NULL, &memid, &found); + ok(hr == E_INVALIDARG, "FindName(not_found, null param) returned: %08x\n", hr); + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, NULL, &found); + ok(hr == E_INVALIDARG, "FindName(not_found, null param) returned: %08x\n", hr); + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, &memid, NULL); + ok(hr == E_INVALIDARG, "FindName(not_found, null param) returned: %08x\n", hr); + found = 1; + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, &memid, &found); + ok(hr == S_OK, "FindName(not_found) failed: %08x\n", hr); + ok(found == 0, "Unexpected found %u\n", found); + hr = ITypeLib_IsName(typelib, NULL, 0, &boolean); + ok(hr == E_INVALIDARG, "IsName(not_found, null name) returned: %08x\n", hr); + hr = ITypeLib_IsName(typelib, str, 0, NULL); + ok(hr == E_INVALIDARG, "IsName(not_found, null out) returned: %08x\n", hr); + hr = ITypeLib_IsName(typelib, str, 0, &boolean); + ok(hr == S_OK, "IsName(not_found) failed: %08x\n", hr); + ok(boolean == FALSE, "Unexpected IsName BOOL return %d\n", boolean); + found = 1; + wcscpy(str, L"Global_VAR"); + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, &memid, &found); + ok(hr == S_OK, "FindName(Global_VAR) failed: %08x\n", hr); + ok(found == 1, "Unexpected found %u\n", found); + ok(memid != MEMBERID_NIL, "Unexpected MEMBERID_NIL memid\n"); + ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo); + ok(!lstrcmpW(str, var[0].name), "Unexpected string %s\n", wine_dbgstr_w(str)); + ITypeInfo_Release(typeinfo2); + wcscpy(str, L"gloBAL_vaR"); + hr = ITypeLib_IsName(typelib, str, 0, &boolean); + ok(hr == S_OK, "IsName(gloBAL_vaR) failed: %08x\n", hr); + ok(boolean == TRUE, "Unexpected IsName BOOL return %d\n", boolean); + ok(!lstrcmpW(str, var[0].name), "Unexpected string %s\n", wine_dbgstr_w(str)); + found = 1; + wcscpy(str, L"IDispatch"); + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, &memid, &found); + ok(hr == S_OK, "FindName(IDispatch) failed: %08x\n", hr); + ok(found == 0, "Unexpected found %u\n", found); + wcscpy(str, L"Invoke"); + hr = ITypeLib_IsName(typelib, str, 0, &boolean); + ok(hr == S_OK, "IsName(Invoke) failed: %08x\n", hr); + ok(boolean == FALSE, "Unexpected IsName BOOL return %d\n", boolean); + + hr = ITypeLib_QueryInterface(typelib, &IID_ITypeComp, (void**)&typecomp); + ok(hr == S_OK, "QueryInterface(IID_ITypeComp) failed: %08x\n", hr); + hr = ITypeLib_GetTypeComp(typelib, NULL); + ok(hr == E_INVALIDARG, "GetTypeComp returned: %08x\n", hr); + hr = ITypeLib_GetTypeComp(typelib, &typecomp2); + ok(hr == S_OK, "GetTypeComp failed: %08x\n", hr); + ok(typecomp == typecomp2, "QueryInterface(IID_ITypeComp) and GetTypeComp returned different TypeComps\n"); + ITypeComp_Release(typecomp2); + + wcscpy(str, var[0].name); + hr = ITypeComp_Bind(typecomp, NULL, 0, 0, &typeinfo2, &desckind, &bindptr); + ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr); + hr = ITypeComp_Bind(typecomp, str, 0, 0, NULL, &desckind, &bindptr); + ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr); + hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, NULL, &bindptr); + ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr); + hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, NULL); + ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr); + hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, &bindptr); + ok(hr == S_OK, "Bind failed: %08x\n", hr); + ok(desckind == DESCKIND_NONE, "Unexpected desckind %u\n", desckind); + wcscpy(str, L"vbscriptTypeInfo"); + hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, &bindptr); + ok(hr == S_OK, "Bind failed: %08x\n", hr); + ok(desckind == DESCKIND_NONE, "Unexpected desckind %u\n", desckind); + hr = ITypeComp_BindType(typecomp, NULL, 0, &typeinfo2, &typecomp2); + ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr); + hr = ITypeComp_BindType(typecomp, str, 0, NULL, &typecomp2); + ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr); + hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, NULL); + ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr); + hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, &typecomp2); + ok(hr == S_OK, "BindType failed: %08x\n", hr); + ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo); + ok(!typecomp2, "Unexpected TypeComp %p (expected null)\n", typecomp2); + ok(!lstrcmpW(str, L"vbscriptTypeInfo"), "Unexpected string %s\n", wine_dbgstr_w(str)); + ITypeInfo_Release(typeinfo2); + wcscpy(str, L"IDispatch"); + hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, &typecomp2); + ok(hr == S_OK, "BindType failed: %08x\n", hr); + ok(!typeinfo2, "Unexpected TypeInfo %p (expected null)\n", typeinfo2); + ok(!typecomp2, "Unexpected TypeComp %p (expected null)\n", typecomp2); + + ITypeComp_Release(typecomp); + ITypeLib_Release(typelib); + /* Updating the script won't update the typeinfo obtained before, but it will be reflected in any typeinfo obtained afterwards. */ parse_script(parser,
Hi Gabriel,
On 27.01.2020 16:32, Gabriel Ivăncescu wrote:
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
dlls/vbscript/vbdisp.c | 153 ++++++++++++++++++++++++++++++++++++++++-
Could we use CreateTypeLib/CreateTypeLib2 for that?
Thanks,
Jacek
On 28/01/2020 17:34, Jacek Caban wrote:
Hi Gabriel,
On 27.01.2020 16:32, Gabriel Ivăncescu wrote:
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
dlls/vbscript/vbdisp.c | 153 ++++++++++++++++++++++++++++++++++++++++-
Could we use CreateTypeLib/CreateTypeLib2 for that?
Thanks,
Jacek
Hi Jacek,
I'm not sure, is there a way to attach an existing TypeInfo to it? We'll definitely need it for the FindName/IsName methods.
Also, it seems it requires a filename, to create on disk, so I don't think it will work as we don't do that. That said, most of it is quite straightforward currently compared to the TypeInfo, except for FindName.
On 28/01/2020 16:41, Gabriel Ivăncescu wrote:
On 28/01/2020 17:34, Jacek Caban wrote:
Hi Gabriel,
On 27.01.2020 16:32, Gabriel Ivăncescu wrote:
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
dlls/vbscript/vbdisp.c | 153 ++++++++++++++++++++++++++++++++++++++++-
Could we use CreateTypeLib/CreateTypeLib2 for that?
Thanks,
Jacek
Hi Jacek,
I'm not sure, is there a way to attach an existing TypeInfo to it?
CreateTypeInfo could be used for TypeInfo.
We'll definitely need it for the FindName/IsName methods.
What's special about FindName/IsName?
Also, it seems it requires a filename, to create on disk, so I don't think it will work as we don't do that.
As far as I can see it just stores the file name so that you may (or may not) save it later.
That said, most of it is quite straightforward currently compared to the TypeInfo, except for FindName.
I tested it and it looks like ICreateTypeLib2 is exposed by native:
https://testbot.winehq.org/JobDetails.pl?Key=64042
And I'm sorry for not asking about it earlier. I assumed that we just need a customized subset of ITypeInfo, not full implementation of all related interfaces.
Thanks,
Jacek
On 29/01/2020 11:20, Jacek Caban wrote:
On 28/01/2020 16:41, Gabriel Ivăncescu wrote:
On 28/01/2020 17:34, Jacek Caban wrote:
Hi Gabriel,
On 27.01.2020 16:32, Gabriel Ivăncescu wrote:
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
dlls/vbscript/vbdisp.c | 153 ++++++++++++++++++++++++++++++++++++++++-
Could we use CreateTypeLib/CreateTypeLib2 for that?
Thanks,
Jacek
Hi Jacek,
I'm not sure, is there a way to attach an existing TypeInfo to it?
CreateTypeInfo could be used for TypeInfo.
We'll definitely need it for the FindName/IsName methods.
What's special about FindName/IsName?
It can, but we already have the TypeInfo. CreateTypeInfo would need to create one from scratch, which seems silly to do just for the typelib. Also, not sure if it matters, but it would copy everything instead of ref-counting like currently, so it's a bit less efficient, too.
FindName/IsName aren't special, but they need access to the function and variable names. Using CreateTypeInfo means rewriting the whole thing or duplicating code just for the typelib, including each function and variable.
Also, it seems it requires a filename, to create on disk, so I don't think it will work as we don't do that.
As far as I can see it just stores the file name so that you may (or may not) save it later.
That said, most of it is quite straightforward currently compared to the TypeInfo, except for FindName.
I tested it and it looks like ICreateTypeLib2 is exposed by native:
https://testbot.winehq.org/JobDetails.pl?Key=64042
And I'm sorry for not asking about it earlier. I assumed that we just need a customized subset of ITypeInfo, not full implementation of all related interfaces.
Thanks,
Jacek
Right, I didn't consider that interface important for now. Either way, if you don't like the current approach for the typelib, I guess I'll postpone it since it's not that important. I wrote it because it was somewhat trivial after the TypeLib patches, instead of having to rewrite all of it. :-)
Thanks, Gabriel