msscript.ocx: Implement ScriptProcedureCollection::get_Item.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com> Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d8e89f3119
commit
e8348bdbcc
|
@ -84,10 +84,18 @@ typedef struct {
|
||||||
ScriptHost *host;
|
ScriptHost *host;
|
||||||
IDispatch *script_dispatch;
|
IDispatch *script_dispatch;
|
||||||
ITypeInfo *script_typeinfo;
|
ITypeInfo *script_typeinfo;
|
||||||
|
ITypeComp *script_typecomp;
|
||||||
|
|
||||||
ScriptProcedureCollection *procedures;
|
ScriptProcedureCollection *procedures;
|
||||||
} ScriptModule;
|
} ScriptModule;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
IScriptProcedure IScriptProcedure_iface;
|
||||||
|
LONG ref;
|
||||||
|
|
||||||
|
BSTR name;
|
||||||
|
} ScriptProcedure;
|
||||||
|
|
||||||
struct ScriptProcedureCollection {
|
struct ScriptProcedureCollection {
|
||||||
IScriptProcedureCollection IScriptProcedureCollection_iface;
|
IScriptProcedureCollection IScriptProcedureCollection_iface;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
|
@ -150,6 +158,7 @@ typedef enum tid_t {
|
||||||
IScriptModuleCollection_tid,
|
IScriptModuleCollection_tid,
|
||||||
IScriptModule_tid,
|
IScriptModule_tid,
|
||||||
IScriptProcedureCollection_tid,
|
IScriptProcedureCollection_tid,
|
||||||
|
IScriptProcedure_tid,
|
||||||
LAST_tid
|
LAST_tid
|
||||||
} tid_t;
|
} tid_t;
|
||||||
|
|
||||||
|
@ -161,6 +170,7 @@ static REFIID tid_ids[] = {
|
||||||
&IID_IScriptModuleCollection,
|
&IID_IScriptModuleCollection,
|
||||||
&IID_IScriptModule,
|
&IID_IScriptModule,
|
||||||
&IID_IScriptProcedureCollection,
|
&IID_IScriptProcedureCollection,
|
||||||
|
&IID_IScriptProcedure
|
||||||
};
|
};
|
||||||
|
|
||||||
static HRESULT load_typelib(void)
|
static HRESULT load_typelib(void)
|
||||||
|
@ -277,6 +287,19 @@ static HRESULT get_script_typeinfo(ScriptModule *module, ITypeInfo **typeinfo)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT get_script_typecomp(ScriptModule *module, ITypeInfo *typeinfo, ITypeComp **typecomp)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
if (!module->script_typecomp)
|
||||||
|
{
|
||||||
|
hr = ITypeInfo_QueryInterface(typeinfo, &IID_ITypeComp, (void**)&module->script_typecomp);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
}
|
||||||
|
*typecomp = module->script_typecomp;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static void uncache_module_objects(ScriptModule *module)
|
static void uncache_module_objects(ScriptModule *module)
|
||||||
{
|
{
|
||||||
if (module->script_dispatch)
|
if (module->script_dispatch)
|
||||||
|
@ -289,6 +312,11 @@ static void uncache_module_objects(ScriptModule *module)
|
||||||
ITypeInfo_Release(module->script_typeinfo);
|
ITypeInfo_Release(module->script_typeinfo);
|
||||||
module->script_typeinfo = NULL;
|
module->script_typeinfo = NULL;
|
||||||
}
|
}
|
||||||
|
if (module->script_typecomp)
|
||||||
|
{
|
||||||
|
ITypeComp_Release(module->script_typecomp);
|
||||||
|
module->script_typecomp = NULL;
|
||||||
|
}
|
||||||
if (module->procedures)
|
if (module->procedures)
|
||||||
module->procedures->count = -1;
|
module->procedures->count = -1;
|
||||||
}
|
}
|
||||||
|
@ -453,6 +481,11 @@ static inline ScriptControl *impl_from_IConnectionPointContainer(IConnectionPoin
|
||||||
return CONTAINING_RECORD(iface, ScriptControl, IConnectionPointContainer_iface);
|
return CONTAINING_RECORD(iface, ScriptControl, IConnectionPointContainer_iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline ScriptProcedure *impl_from_IScriptProcedure(IScriptProcedure *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, ScriptProcedure, IScriptProcedure_iface);
|
||||||
|
}
|
||||||
|
|
||||||
static inline ScriptProcedureCollection *impl_from_IScriptProcedureCollection(IScriptProcedureCollection *iface)
|
static inline ScriptProcedureCollection *impl_from_IScriptProcedureCollection(IScriptProcedureCollection *iface)
|
||||||
{
|
{
|
||||||
return CONTAINING_RECORD(iface, ScriptProcedureCollection, IScriptProcedureCollection_iface);
|
return CONTAINING_RECORD(iface, ScriptProcedureCollection, IScriptProcedureCollection_iface);
|
||||||
|
@ -728,6 +761,181 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
|
||||||
ServiceProvider_QueryService
|
ServiceProvider_QueryService
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static HRESULT WINAPI ScriptProcedure_QueryInterface(IScriptProcedure *iface, REFIID riid, void **ppv)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
|
||||||
|
if (IsEqualGUID(&IID_IDispatch, riid) || IsEqualGUID(&IID_IUnknown, riid) ||
|
||||||
|
IsEqualGUID(&IID_IScriptProcedure, riid))
|
||||||
|
{
|
||||||
|
*ppv = &This->IScriptProcedure_iface;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("unsupported interface: (%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
|
||||||
|
*ppv = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI ScriptProcedure_AddRef(IScriptProcedure *iface)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
LONG ref = InterlockedIncrement(&This->ref);
|
||||||
|
|
||||||
|
TRACE("(%p) ref=%d\n", This, ref);
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI ScriptProcedure_Release(IScriptProcedure *iface)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
LONG ref = InterlockedDecrement(&This->ref);
|
||||||
|
|
||||||
|
TRACE("(%p) ref=%d\n", This, ref);
|
||||||
|
|
||||||
|
if (!ref)
|
||||||
|
{
|
||||||
|
SysFreeString(This->name);
|
||||||
|
heap_free(This);
|
||||||
|
}
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI ScriptProcedure_GetTypeInfoCount(IScriptProcedure *iface, UINT *pctinfo)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
|
||||||
|
TRACE("(%p)->(%p)\n", This, pctinfo);
|
||||||
|
|
||||||
|
*pctinfo = 1;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI ScriptProcedure_GetTypeInfo(IScriptProcedure *iface, UINT iTInfo,
|
||||||
|
LCID lcid, ITypeInfo **ppTInfo)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
|
||||||
|
TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
|
||||||
|
|
||||||
|
return get_typeinfo(IScriptProcedure_tid, ppTInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI ScriptProcedure_GetIDsOfNames(IScriptProcedure *iface, REFIID riid,
|
||||||
|
LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
ITypeInfo *typeinfo;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
|
||||||
|
|
||||||
|
hr = get_typeinfo(IScriptProcedure_tid, &typeinfo);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
|
||||||
|
ITypeInfo_Release(typeinfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI ScriptProcedure_Invoke(IScriptProcedure *iface, DISPID dispIdMember,
|
||||||
|
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
|
||||||
|
EXCEPINFO *pExcepInfo, UINT *puArgErr)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
ITypeInfo *typeinfo;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
|
||||||
|
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
|
||||||
|
|
||||||
|
hr = get_typeinfo(IScriptProcedure_tid, &typeinfo);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
hr = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags,
|
||||||
|
pDispParams, pVarResult, pExcepInfo, puArgErr);
|
||||||
|
ITypeInfo_Release(typeinfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI ScriptProcedure_get_Name(IScriptProcedure *iface, BSTR *pbstrName)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
|
||||||
|
FIXME("(%p)->(%p)\n", This, pbstrName);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI ScriptProcedure_get_NumArgs(IScriptProcedure *iface, LONG *pcArgs)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
|
||||||
|
FIXME("(%p)->(%p)\n", This, pcArgs);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI ScriptProcedure_get_HasReturnValue(IScriptProcedure *iface, VARIANT_BOOL *pfHasReturnValue)
|
||||||
|
{
|
||||||
|
ScriptProcedure *This = impl_from_IScriptProcedure(iface);
|
||||||
|
|
||||||
|
FIXME("(%p)->(%p)\n", This, pfHasReturnValue);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const IScriptProcedureVtbl ScriptProcedureVtbl = {
|
||||||
|
ScriptProcedure_QueryInterface,
|
||||||
|
ScriptProcedure_AddRef,
|
||||||
|
ScriptProcedure_Release,
|
||||||
|
ScriptProcedure_GetTypeInfoCount,
|
||||||
|
ScriptProcedure_GetTypeInfo,
|
||||||
|
ScriptProcedure_GetIDsOfNames,
|
||||||
|
ScriptProcedure_Invoke,
|
||||||
|
ScriptProcedure_get_Name,
|
||||||
|
ScriptProcedure_get_NumArgs,
|
||||||
|
ScriptProcedure_get_HasReturnValue
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This function always releases the FUNCDESC passed in */
|
||||||
|
static HRESULT get_script_procedure(ITypeInfo *typeinfo, FUNCDESC *desc, IScriptProcedure **procedure)
|
||||||
|
{
|
||||||
|
ScriptProcedure *proc;
|
||||||
|
HRESULT hr;
|
||||||
|
BSTR str;
|
||||||
|
UINT len;
|
||||||
|
|
||||||
|
hr = ITypeInfo_GetNames(typeinfo, desc->memid, &str, 1, &len);
|
||||||
|
if (FAILED(hr)) goto done;
|
||||||
|
|
||||||
|
if (!(proc = heap_alloc(sizeof(*proc))))
|
||||||
|
{
|
||||||
|
hr = E_OUTOFMEMORY;
|
||||||
|
SysFreeString(str);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
proc->IScriptProcedure_iface.lpVtbl = &ScriptProcedureVtbl;
|
||||||
|
proc->ref = 1;
|
||||||
|
proc->name = str;
|
||||||
|
|
||||||
|
*procedure = &proc->IScriptProcedure_iface;
|
||||||
|
|
||||||
|
done:
|
||||||
|
ITypeInfo_ReleaseFuncDesc(typeinfo, desc);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI ScriptProcedureCollection_QueryInterface(IScriptProcedureCollection *iface, REFIID riid, void **ppv)
|
static HRESULT WINAPI ScriptProcedureCollection_QueryInterface(IScriptProcedureCollection *iface, REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
|
ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
|
||||||
|
@ -848,10 +1056,64 @@ static HRESULT WINAPI ScriptProcedureCollection_get_Item(IScriptProcedureCollect
|
||||||
IScriptProcedure **ppdispProcedure)
|
IScriptProcedure **ppdispProcedure)
|
||||||
{
|
{
|
||||||
ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
|
ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
|
||||||
|
ITypeInfo *typeinfo;
|
||||||
|
FUNCDESC *desc;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
FIXME("(%p)->(%s %p)\n", This, wine_dbgstr_variant(&index), ppdispProcedure);
|
TRACE("(%p)->(%s %p)\n", This, wine_dbgstr_variant(&index), ppdispProcedure);
|
||||||
|
|
||||||
return E_NOTIMPL;
|
if (!ppdispProcedure) return E_POINTER;
|
||||||
|
if (!This->module->host) return E_FAIL;
|
||||||
|
|
||||||
|
hr = start_script(This->module->host);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
hr = get_script_typeinfo(This->module, &typeinfo);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
if (V_VT(&index) == VT_BSTR)
|
||||||
|
{
|
||||||
|
ITypeComp *comp;
|
||||||
|
BINDPTR bindptr;
|
||||||
|
DESCKIND kind;
|
||||||
|
ULONG hash;
|
||||||
|
|
||||||
|
hash = LHashValOfNameSys(sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32, LOCALE_USER_DEFAULT, V_BSTR(&index));
|
||||||
|
|
||||||
|
hr = get_script_typecomp(This->module, typeinfo, &comp);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
hr = ITypeComp_Bind(comp, V_BSTR(&index), hash, INVOKE_FUNC, &typeinfo, &kind, &bindptr);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
switch (kind)
|
||||||
|
{
|
||||||
|
case DESCKIND_FUNCDESC:
|
||||||
|
hr = get_script_procedure(typeinfo, bindptr.lpfuncdesc, ppdispProcedure);
|
||||||
|
ITypeInfo_Release(typeinfo);
|
||||||
|
return hr;
|
||||||
|
case DESCKIND_IMPLICITAPPOBJ:
|
||||||
|
case DESCKIND_VARDESC:
|
||||||
|
ITypeInfo_ReleaseVarDesc(typeinfo, bindptr.lpvardesc);
|
||||||
|
ITypeInfo_Release(typeinfo);
|
||||||
|
break;
|
||||||
|
case DESCKIND_TYPECOMP:
|
||||||
|
ITypeComp_Release(bindptr.lptcomp);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return CTL_E_ILLEGALFUNCTIONCALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = VariantChangeType(&index, &index, 0, VT_INT);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
if (V_INT(&index) <= 0) return 0x800a0009;
|
||||||
|
|
||||||
|
hr = ITypeInfo_GetFuncDesc(typeinfo, V_INT(&index) - 1, &desc);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
return get_script_procedure(typeinfo, desc, ppdispProcedure);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI ScriptProcedureCollection_get_Count(IScriptProcedureCollection *iface, LONG *plCount)
|
static HRESULT WINAPI ScriptProcedureCollection_get_Count(IScriptProcedureCollection *iface, LONG *plCount)
|
||||||
|
|
|
@ -3325,9 +3325,9 @@ static void test_IScriptControl_get_Procedures(void)
|
||||||
V_VT(&var) = VT_I4;
|
V_VT(&var) = VT_I4;
|
||||||
V_I4(&var) = -1;
|
V_I4(&var) = -1;
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, NULL);
|
hr = IScriptProcedureCollection_get_Item(procs, var, NULL);
|
||||||
todo_wine ok(hr == E_POINTER, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
ok(hr == E_POINTER, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == 0x800a0009, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
ok(hr == 0x800a0009, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
||||||
|
|
||||||
str = SysAllocString(L""
|
str = SysAllocString(L""
|
||||||
"function add(a, b) { return a + b; }\n"
|
"function add(a, b) { return a + b; }\n"
|
||||||
|
@ -3348,25 +3348,25 @@ static void test_IScriptControl_get_Procedures(void)
|
||||||
IScriptProcedureCollection_AddRef(procs);
|
IScriptProcedureCollection_AddRef(procs);
|
||||||
i = IScriptProcedureCollection_Release(procs);
|
i = IScriptProcedureCollection_Release(procs);
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == S_OK, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
ok(hr == S_OK, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
||||||
IScriptProcedureCollection_AddRef(procs);
|
IScriptProcedureCollection_AddRef(procs);
|
||||||
ok(i == IScriptProcedureCollection_Release(procs),
|
ok(i == IScriptProcedureCollection_Release(procs),
|
||||||
"IScriptProcedureCollection_get_Item should not have added a ref to the collection.\n");
|
"IScriptProcedureCollection_get_Item should not have added a ref to the collection.\n");
|
||||||
if (hr == S_OK) IScriptProcedure_Release(proc);
|
IScriptProcedure_Release(proc);
|
||||||
|
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = SysAllocString(L"Nop");
|
V_BSTR(&var) = SysAllocString(L"Nop");
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == S_OK, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
ok(hr == S_OK, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
||||||
ok(V_VT(&var) == VT_BSTR, "var type not BSTR, got %d.\n", V_VT(&var));
|
ok(V_VT(&var) == VT_BSTR, "var type not BSTR, got %d.\n", V_VT(&var));
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
if (hr == S_OK) IScriptProcedure_Release(proc);
|
IScriptProcedure_Release(proc);
|
||||||
|
|
||||||
V_VT(&var) = VT_R8;
|
V_VT(&var) = VT_R8;
|
||||||
V_R8(&var) = 3.0;
|
V_R8(&var) = 3.0;
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == S_OK, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
ok(hr == S_OK, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
||||||
if (hr == S_OK) IScriptProcedure_Release(proc);
|
IScriptProcedure_Release(proc);
|
||||||
|
|
||||||
IScriptProcedureCollection_Release(procs);
|
IScriptProcedureCollection_Release(procs);
|
||||||
IScriptControl_Release(sc);
|
IScriptControl_Release(sc);
|
||||||
|
@ -3464,10 +3464,10 @@ static void test_IScriptControl_get_Procedures(void)
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = SysAllocString(L"foobar");
|
V_BSTR(&var) = SysAllocString(L"foobar");
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == E_NOINTERFACE, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
ok(hr == E_NOINTERFACE, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
||||||
ok(V_VT(&var) == VT_BSTR, "var type not BSTR, got %d.\n", V_VT(&var));
|
ok(V_VT(&var) == VT_BSTR, "var type not BSTR, got %d.\n", V_VT(&var));
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
todo_wine CHECK_CALLED(QI_ITypeComp);
|
CHECK_CALLED(QI_ITypeComp);
|
||||||
|
|
||||||
/* Make ITypeComp available */
|
/* Make ITypeComp available */
|
||||||
TypeComp_available = TRUE;
|
TypeComp_available = TRUE;
|
||||||
|
@ -3476,43 +3476,43 @@ static void test_IScriptControl_get_Procedures(void)
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = SysAllocString(L"type_mismatch");
|
V_BSTR(&var) = SysAllocString(L"type_mismatch");
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == TYPE_E_TYPEMISMATCH, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
ok(hr == TYPE_E_TYPEMISMATCH, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
todo_wine CHECK_CALLED(QI_ITypeComp);
|
CHECK_CALLED(QI_ITypeComp);
|
||||||
todo_wine CHECK_CALLED(Bind);
|
CHECK_CALLED(Bind);
|
||||||
TypeComp_available = FALSE;
|
TypeComp_available = FALSE;
|
||||||
|
|
||||||
SET_EXPECT(Bind);
|
SET_EXPECT(Bind);
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = SysAllocString(L"not_found");
|
V_BSTR(&var) = SysAllocString(L"not_found");
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == CTL_E_ILLEGALFUNCTIONCALL, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
ok(hr == CTL_E_ILLEGALFUNCTIONCALL, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
todo_wine CHECK_CALLED(Bind);
|
CHECK_CALLED(Bind);
|
||||||
|
|
||||||
SET_EXPECT(Bind);
|
SET_EXPECT(Bind);
|
||||||
SET_EXPECT(ReleaseVarDesc);
|
SET_EXPECT(ReleaseVarDesc);
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = SysAllocString(L"variable");
|
V_BSTR(&var) = SysAllocString(L"variable");
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == CTL_E_ILLEGALFUNCTIONCALL, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
ok(hr == CTL_E_ILLEGALFUNCTIONCALL, "IScriptProcedureCollection_get_Item failed: 0x%08x.\n", hr);
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
todo_wine CHECK_CALLED(Bind);
|
CHECK_CALLED(Bind);
|
||||||
todo_wine CHECK_CALLED(ReleaseVarDesc);
|
CHECK_CALLED(ReleaseVarDesc);
|
||||||
|
|
||||||
/* Index 0 and below are invalid (doesn't even call GetFuncDesc) */
|
/* Index 0 and below are invalid (doesn't even call GetFuncDesc) */
|
||||||
V_VT(&var) = VT_I4;
|
V_VT(&var) = VT_I4;
|
||||||
V_I4(&var) = 0;
|
V_I4(&var) = 0;
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == 0x800a0009, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
ok(hr == 0x800a0009, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
||||||
V_I4(&var) = -1;
|
V_I4(&var) = -1;
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == 0x800a0009, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
ok(hr == 0x800a0009, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
||||||
SET_EXPECT(GetFuncDesc);
|
SET_EXPECT(GetFuncDesc);
|
||||||
V_I4(&var) = 1337;
|
V_I4(&var) = 1337;
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == E_INVALIDARG, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
ok(hr == E_INVALIDARG, "IScriptProcedureCollection_get_Item returned: 0x%08x.\n", hr);
|
||||||
todo_wine CHECK_CALLED(GetFuncDesc);
|
CHECK_CALLED(GetFuncDesc);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(custom_engine_funcs); i++)
|
for (i = 0; i < ARRAY_SIZE(custom_engine_funcs); i++)
|
||||||
{
|
{
|
||||||
|
@ -3523,11 +3523,11 @@ static void test_IScriptControl_get_Procedures(void)
|
||||||
V_VT(&var) = VT_R4;
|
V_VT(&var) = VT_R4;
|
||||||
V_R4(&var) = i + 1;
|
V_R4(&var) = i + 1;
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == S_OK, "get_Item for index %u failed: 0x%08x.\n", i, hr);
|
ok(hr == S_OK, "get_Item for index %u failed: 0x%08x.\n", i, hr);
|
||||||
todo_wine CHECK_CALLED(GetFuncDesc);
|
CHECK_CALLED(GetFuncDesc);
|
||||||
todo_wine CHECK_CALLED(GetNames);
|
CHECK_CALLED(GetNames);
|
||||||
todo_wine CHECK_CALLED(ReleaseFuncDesc);
|
CHECK_CALLED(ReleaseFuncDesc);
|
||||||
if (hr == S_OK) IScriptProcedure_Release(proc);
|
IScriptProcedure_Release(proc);
|
||||||
|
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = SysAllocString(custom_engine_funcs[i].name);
|
V_BSTR(&var) = SysAllocString(custom_engine_funcs[i].name);
|
||||||
|
@ -3535,12 +3535,12 @@ static void test_IScriptControl_get_Procedures(void)
|
||||||
SET_EXPECT(GetNames);
|
SET_EXPECT(GetNames);
|
||||||
SET_EXPECT(ReleaseFuncDesc);
|
SET_EXPECT(ReleaseFuncDesc);
|
||||||
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
hr = IScriptProcedureCollection_get_Item(procs, var, &proc);
|
||||||
todo_wine ok(hr == S_OK, "get_Item for %s failed: 0x%08x.\n", wine_dbgstr_w(custom_engine_funcs[i].name), hr);
|
ok(hr == S_OK, "get_Item for %s failed: 0x%08x.\n", wine_dbgstr_w(custom_engine_funcs[i].name), hr);
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
todo_wine CHECK_CALLED(Bind);
|
CHECK_CALLED(Bind);
|
||||||
todo_wine CHECK_CALLED(GetNames);
|
CHECK_CALLED(GetNames);
|
||||||
todo_wine CHECK_CALLED(ReleaseFuncDesc);
|
CHECK_CALLED(ReleaseFuncDesc);
|
||||||
if (hr == S_OK) IScriptProcedure_Release(proc);
|
IScriptProcedure_Release(proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
IScriptProcedureCollection_Release(procs);
|
IScriptProcedureCollection_Release(procs);
|
||||||
|
|
Loading…
Reference in New Issue