2 * Copyright 2015 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 DEFINE_GUID(GUID_NULL
,0,0,0,0,0,0,0,0,0,0,0);
32 #include "wine/debug.h"
33 #include "wine/heap.h"
34 #include "wine/list.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(msscript
);
40 #define IActiveScriptParse_Release IActiveScriptParse64_Release
41 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
42 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
46 #define IActiveScriptParse_Release IActiveScriptParse32_Release
47 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
48 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
53 typedef struct ConnectionPoint ConnectionPoint
;
54 typedef struct ScriptProcedureCollection ScriptProcedureCollection
;
55 typedef struct ScriptHost ScriptHost
;
57 struct ConnectionPoint
{
58 IConnectionPoint IConnectionPoint_iface
;
59 ScriptControl
*control
;
61 ConnectionPoint
*next
;
71 IEnumVARIANT IEnumVARIANT_iface
;
76 ScriptControl
*control
;
80 IScriptModule IScriptModule_iface
;
85 IDispatch
*script_dispatch
;
86 ITypeInfo
*script_typeinfo
;
87 ITypeComp
*script_typecomp
;
89 ScriptProcedureCollection
*procedures
;
93 IScriptProcedure IScriptProcedure_iface
;
104 struct ScriptProcedureCollection
{
105 IScriptProcedureCollection IScriptProcedureCollection_iface
;
109 ScriptModule
*module
;
110 struct list hash_table
[43];
113 struct procedure_enum
{
114 IEnumVARIANT IEnumVARIANT_iface
;
119 ScriptProcedureCollection
*procedures
;
123 IScriptError IScriptError_iface
;
124 IActiveScriptError
*object
;
142 IActiveScriptSite IActiveScriptSite_iface
;
143 IActiveScriptSiteWindow IActiveScriptSiteWindow_iface
;
144 IServiceProvider IServiceProvider_iface
;
147 IActiveScript
*script
;
148 IActiveScriptParse
*parse
;
151 SCRIPTSTATE script_state
;
154 unsigned int module_count
;
155 struct list named_items
;
158 struct ScriptControl
{
159 IScriptControl IScriptControl_iface
;
160 IPersistStreamInit IPersistStreamInit_iface
;
161 IOleObject IOleObject_iface
;
162 IOleControl IOleControl_iface
;
163 IQuickActivate IQuickActivate_iface
;
164 IViewObjectEx IViewObjectEx_iface
;
165 IPointerInactive IPointerInactive_iface
;
166 IConnectionPointContainer IConnectionPointContainer_iface
;
168 IOleClientSite
*site
;
172 VARIANT_BOOL allow_ui
;
173 VARIANT_BOOL use_safe_subset
;
175 /* connection points */
176 ConnectionPoint
*cp_list
;
177 ConnectionPoint cp_scsource
;
178 ConnectionPoint cp_propnotif
;
180 /* IViewObject sink */
181 IAdviseSink
*view_sink
;
182 DWORD view_sink_flags
;
185 ScriptModule
**modules
;
186 IScriptModuleCollection IScriptModuleCollection_iface
;
192 static HINSTANCE msscript_instance
;
197 IScriptModuleCollection_tid
,
199 IScriptProcedureCollection_tid
,
200 IScriptProcedure_tid
,
204 static ITypeLib
*typelib
;
205 static ITypeInfo
*typeinfos
[LAST_tid
];
207 static REFIID tid_ids
[] = {
210 &IID_IScriptModuleCollection
,
212 &IID_IScriptProcedureCollection
,
213 &IID_IScriptProcedure
216 static HRESULT
load_typelib(void)
221 hres
= LoadRegTypeLib(&LIBID_MSScriptControl
, 1, 0, LOCALE_SYSTEM_DEFAULT
, &tl
);
223 ERR("LoadRegTypeLib failed: %08x\n", hres
);
227 if(InterlockedCompareExchangePointer((void**)&typelib
, tl
, NULL
))
228 ITypeLib_Release(tl
);
232 static HRESULT
get_typeinfo(tid_t tid
, ITypeInfo
**typeinfo
)
237 hres
= load_typelib();
241 if(!typeinfos
[tid
]) {
244 hres
= ITypeLib_GetTypeInfoOfGuid(typelib
, tid_ids
[tid
], &ti
);
246 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids
[tid
]), hres
);
250 if(InterlockedCompareExchangePointer((void**)(typeinfos
+tid
), ti
, NULL
))
251 ITypeInfo_Release(ti
);
254 *typeinfo
= typeinfos
[tid
];
255 ITypeInfo_AddRef(typeinfos
[tid
]);
259 static void release_typelib(void)
266 for(i
= 0; i
< ARRAY_SIZE(typeinfos
); i
++)
268 ITypeInfo_Release(typeinfos
[i
]);
270 ITypeLib_Release(typelib
);
273 static inline BOOL
is_power_of_2(unsigned x
)
275 return !(x
& (x
- 1));
278 static void clear_named_items(ScriptHost
*host
)
280 struct named_item
*item
, *item1
;
281 LIST_FOR_EACH_ENTRY_SAFE(item
, item1
, &host
->named_items
, struct named_item
, entry
) {
282 list_remove(&item
->entry
);
283 SysFreeString(item
->name
);
284 IDispatch_Release(item
->disp
);
289 static struct named_item
*host_get_named_item(ScriptHost
*host
, const WCHAR
*nameW
)
291 struct named_item
*item
;
293 LIST_FOR_EACH_ENTRY(item
, &host
->named_items
, struct named_item
, entry
) {
294 if (!wcscmp(item
->name
, nameW
))
301 static HRESULT
get_script_dispatch(ScriptModule
*module
, IDispatch
**disp
)
303 if (!module
->script_dispatch
)
305 HRESULT hr
= IActiveScript_GetScriptDispatch(module
->host
->script
,
306 module
->name
, &module
->script_dispatch
);
307 if (FAILED(hr
)) return hr
;
309 *disp
= module
->script_dispatch
;
313 static HRESULT
get_script_typeinfo(ScriptModule
*module
, ITypeInfo
**typeinfo
)
318 if (!module
->script_typeinfo
)
320 hr
= get_script_dispatch(module
, &disp
);
321 if (FAILED(hr
)) return hr
;
323 hr
= IDispatch_GetTypeInfo(disp
, 0, LOCALE_USER_DEFAULT
, &module
->script_typeinfo
);
324 if (FAILED(hr
)) return hr
;
326 *typeinfo
= module
->script_typeinfo
;
330 static HRESULT
get_script_typecomp(ScriptModule
*module
, ITypeInfo
*typeinfo
, ITypeComp
**typecomp
)
334 if (!module
->script_typecomp
)
336 hr
= ITypeInfo_QueryInterface(typeinfo
, &IID_ITypeComp
, (void**)&module
->script_typecomp
);
337 if (FAILED(hr
)) return hr
;
339 *typecomp
= module
->script_typecomp
;
343 static void uncache_module_objects(ScriptModule
*module
)
345 if (module
->script_dispatch
)
347 IDispatch_Release(module
->script_dispatch
);
348 module
->script_dispatch
= NULL
;
350 if (module
->script_typeinfo
)
352 ITypeInfo_Release(module
->script_typeinfo
);
353 module
->script_typeinfo
= NULL
;
355 if (module
->script_typecomp
)
357 ITypeComp_Release(module
->script_typecomp
);
358 module
->script_typecomp
= NULL
;
362 static HRESULT
set_script_state(ScriptHost
*host
, SCRIPTSTATE state
)
366 hr
= IActiveScript_SetScriptState(host
->script
, state
);
368 host
->script_state
= state
;
372 static HRESULT
start_script(ScriptModule
*module
)
376 if (module
->host
->script_state
!= SCRIPTSTATE_STARTED
)
378 hr
= set_script_state(module
->host
, SCRIPTSTATE_STARTED
);
379 if (SUCCEEDED(hr
)) uncache_module_objects(module
);
385 static HRESULT
add_script_object(ScriptHost
*host
, BSTR name
, IDispatch
*object
, DWORD flags
)
387 struct named_item
*item
;
390 if (host_get_named_item(host
, name
))
393 item
= heap_alloc(sizeof(*item
));
395 return E_OUTOFMEMORY
;
397 item
->name
= SysAllocString(name
);
401 return E_OUTOFMEMORY
;
403 IDispatch_AddRef(item
->disp
= object
);
404 list_add_tail(&host
->named_items
, &item
->entry
);
406 hr
= IActiveScript_AddNamedItem(host
->script
, name
, flags
);
409 list_remove(&item
->entry
);
410 IDispatch_Release(item
->disp
);
411 SysFreeString(item
->name
);
419 static HRESULT
parse_script_text(ScriptModule
*module
, BSTR script_text
, DWORD flag
, VARIANT
*res
)
424 hr
= start_script(module
);
425 if (FAILED(hr
)) return hr
;
427 uncache_module_objects(module
);
428 if (module
->procedures
)
429 module
->procedures
->count
= -1;
431 hr
= IActiveScriptParse_ParseScriptText(module
->host
->parse
, script_text
, module
->name
,
432 NULL
, NULL
, 0, 1, flag
, res
, &excepinfo
);
433 /* FIXME: more error handling */
437 static HRESULT WINAPI
sp_caller_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **obj
)
439 if (IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IServiceProvider
, riid
))
443 FIXME("(%p)->(%s)\n", iface
, debugstr_guid(riid
));
445 return E_NOINTERFACE
;
448 IUnknown_AddRef((IUnknown
*)*obj
);
452 static ULONG WINAPI
sp_caller_AddRef(IServiceProvider
*iface
)
457 static ULONG WINAPI
sp_caller_Release(IServiceProvider
*iface
)
462 static HRESULT WINAPI
sp_caller_QueryService(IServiceProvider
*iface
, REFGUID service
, REFIID riid
, void **obj
)
464 FIXME("(%p)->(%s %s %p): semi-stub\n", iface
, debugstr_guid(service
), debugstr_guid(riid
), obj
);
467 if (IsEqualGUID(&SID_GetCaller
, service
))
470 return E_NOINTERFACE
;
473 static const IServiceProviderVtbl sp_caller_vtbl
= {
474 sp_caller_QueryInterface
,
477 sp_caller_QueryService
480 static IServiceProvider sp_caller
= { &sp_caller_vtbl
};
482 static HRESULT
run_procedure(ScriptModule
*module
, BSTR procedure_name
, SAFEARRAY
*args
, VARIANT
*res
)
491 hr
= start_script(module
);
492 if (FAILED(hr
)) return hr
;
494 hr
= get_script_dispatch(module
, &disp
);
495 if (FAILED(hr
)) return hr
;
497 hr
= IDispatch_GetIDsOfNames(disp
, &IID_NULL
, &procedure_name
, 1, LOCALE_USER_DEFAULT
, &dispid
);
498 if (FAILED(hr
)) return hr
;
500 dp
.cArgs
= args
->rgsabound
[0].cElements
;
501 dp
.rgdispidNamedArgs
= NULL
;
503 dp
.rgvarg
= heap_alloc(dp
.cArgs
* sizeof(*dp
.rgvarg
));
504 if (!dp
.rgvarg
) return E_OUTOFMEMORY
;
506 hr
= SafeArrayLock(args
);
509 /* The DISPPARAMS are stored in reverse order */
510 for (i
= 0; i
< dp
.cArgs
; i
++)
511 dp
.rgvarg
[i
] = *(VARIANT
*)((char*)(args
->pvData
) + (dp
.cArgs
- i
- 1) * args
->cbElements
);
512 SafeArrayUnlock(args
);
514 hr
= IDispatch_QueryInterface(disp
, &IID_IDispatchEx
, (void**)&dispex
);
517 hr
= IDispatch_Invoke(disp
, dispid
, &IID_NULL
, LOCALE_USER_DEFAULT
,
518 DISPATCH_METHOD
, &dp
, res
, NULL
, NULL
);
522 hr
= IDispatchEx_InvokeEx(dispex
, dispid
, LOCALE_USER_DEFAULT
,
523 DISPATCH_METHOD
, &dp
, res
, NULL
, &sp_caller
);
524 IDispatchEx_Release(dispex
);
527 heap_free(dp
.rgvarg
);
532 static inline ScriptControl
*impl_from_IScriptControl(IScriptControl
*iface
)
534 return CONTAINING_RECORD(iface
, ScriptControl
, IScriptControl_iface
);
537 static inline ScriptControl
*impl_from_IOleObject(IOleObject
*iface
)
539 return CONTAINING_RECORD(iface
, ScriptControl
, IOleObject_iface
);
542 static inline ScriptControl
*impl_from_IPersistStreamInit(IPersistStreamInit
*iface
)
544 return CONTAINING_RECORD(iface
, ScriptControl
, IPersistStreamInit_iface
);
547 static inline ScriptControl
*impl_from_IOleControl(IOleControl
*iface
)
549 return CONTAINING_RECORD(iface
, ScriptControl
, IOleControl_iface
);
552 static inline ScriptControl
*impl_from_IQuickActivate(IQuickActivate
*iface
)
554 return CONTAINING_RECORD(iface
, ScriptControl
, IQuickActivate_iface
);
557 static inline ScriptControl
*impl_from_IViewObjectEx(IViewObjectEx
*iface
)
559 return CONTAINING_RECORD(iface
, ScriptControl
, IViewObjectEx_iface
);
562 static inline ScriptControl
*impl_from_IPointerInactive(IPointerInactive
*iface
)
564 return CONTAINING_RECORD(iface
, ScriptControl
, IPointerInactive_iface
);
567 static inline ScriptControl
*impl_from_IConnectionPointContainer(IConnectionPointContainer
*iface
)
569 return CONTAINING_RECORD(iface
, ScriptControl
, IConnectionPointContainer_iface
);
572 static inline ScriptProcedure
*impl_from_IScriptProcedure(IScriptProcedure
*iface
)
574 return CONTAINING_RECORD(iface
, ScriptProcedure
, IScriptProcedure_iface
);
577 static inline ScriptProcedureCollection
*impl_from_IScriptProcedureCollection(IScriptProcedureCollection
*iface
)
579 return CONTAINING_RECORD(iface
, ScriptProcedureCollection
, IScriptProcedureCollection_iface
);
582 static inline ScriptControl
*impl_from_IScriptModuleCollection(IScriptModuleCollection
*iface
)
584 return CONTAINING_RECORD(iface
, ScriptControl
, IScriptModuleCollection_iface
);
587 static inline ScriptModule
*impl_from_IScriptModule(IScriptModule
*iface
)
589 return CONTAINING_RECORD(iface
, ScriptModule
, IScriptModule_iface
);
592 static inline ScriptError
*impl_from_IScriptError(IScriptError
*iface
)
594 return CONTAINING_RECORD(iface
, ScriptError
, IScriptError_iface
);
597 static inline ConnectionPoint
*impl_from_IConnectionPoint(IConnectionPoint
*iface
)
599 return CONTAINING_RECORD(iface
, ConnectionPoint
, IConnectionPoint_iface
);
602 static inline ScriptHost
*impl_from_IActiveScriptSite(IActiveScriptSite
*iface
)
604 return CONTAINING_RECORD(iface
, ScriptHost
, IActiveScriptSite_iface
);
607 static inline ScriptHost
*impl_from_IActiveScriptSiteWindow(IActiveScriptSiteWindow
*iface
)
609 return CONTAINING_RECORD(iface
, ScriptHost
, IActiveScriptSiteWindow_iface
);
612 static inline ScriptHost
*impl_from_IServiceProvider(IServiceProvider
*iface
)
614 return CONTAINING_RECORD(iface
, ScriptHost
, IServiceProvider_iface
);
617 static inline struct module_enum
*module_enum_from_IEnumVARIANT(IEnumVARIANT
*iface
)
619 return CONTAINING_RECORD(iface
, struct module_enum
, IEnumVARIANT_iface
);
622 static inline struct procedure_enum
*procedure_enum_from_IEnumVARIANT(IEnumVARIANT
*iface
)
624 return CONTAINING_RECORD(iface
, struct procedure_enum
, IEnumVARIANT_iface
);
627 /* IActiveScriptSite */
628 static HRESULT WINAPI
ActiveScriptSite_QueryInterface(IActiveScriptSite
*iface
, REFIID riid
, void **ppv
)
630 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
632 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
633 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
634 *ppv
= &This
->IActiveScriptSite_iface
;
635 }else if(IsEqualGUID(&IID_IActiveScriptSite
, riid
)) {
636 TRACE("(%p)->(IID_IActiveScriptSite %p)\n", This
, ppv
);
637 *ppv
= &This
->IActiveScriptSite_iface
;
638 }else if(IsEqualGUID(&IID_IActiveScriptSiteWindow
, riid
)) {
639 TRACE("(%p)->(IID_IActiveScriptSiteWindow %p)\n", This
, ppv
);
640 *ppv
= &This
->IActiveScriptSiteWindow_iface
;
641 }else if(IsEqualGUID(&IID_IServiceProvider
, riid
)) {
642 TRACE("(%p)->(IID_IServiceProvider %p)\n", This
, ppv
);
643 *ppv
= &This
->IServiceProvider_iface
;
645 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
647 return E_NOINTERFACE
;
650 IUnknown_AddRef((IUnknown
*)*ppv
);
654 static ULONG WINAPI
ActiveScriptSite_AddRef(IActiveScriptSite
*iface
)
656 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
657 LONG ref
= InterlockedIncrement(&This
->ref
);
659 TRACE("(%p) ref=%d\n", This
, ref
);
664 static ULONG WINAPI
ActiveScriptSite_Release(IActiveScriptSite
*iface
)
666 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
667 LONG ref
= InterlockedDecrement(&This
->ref
);
669 TRACE("(%p) ref=%d\n", This
, ref
);
672 clear_named_items(This
);
679 static HRESULT WINAPI
ActiveScriptSite_GetLCID(IActiveScriptSite
*iface
, LCID
*lcid
)
681 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
683 TRACE("(%p, %p)\n", This
, lcid
);
685 *lcid
= GetUserDefaultLCID();
689 static HRESULT WINAPI
ActiveScriptSite_GetItemInfo(IActiveScriptSite
*iface
, LPCOLESTR name
, DWORD mask
,
690 IUnknown
**unk
, ITypeInfo
**ti
)
692 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
693 struct named_item
*item
;
695 TRACE("(%p, %s, %#x, %p, %p)\n", This
, debugstr_w(name
), mask
, unk
, ti
);
697 item
= host_get_named_item(This
, name
);
699 return TYPE_E_ELEMENTNOTFOUND
;
701 if (mask
!= SCRIPTINFO_IUNKNOWN
) {
702 FIXME("mask %#x is not supported\n", mask
);
706 *unk
= (IUnknown
*)item
->disp
;
707 IUnknown_AddRef(*unk
);
712 static HRESULT WINAPI
ActiveScriptSite_GetDocVersionString(IActiveScriptSite
*iface
, BSTR
*version
)
714 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
716 FIXME("(%p, %p)\n", This
, version
);
721 static HRESULT WINAPI
ActiveScriptSite_OnScriptTerminate(IActiveScriptSite
*iface
, const VARIANT
*result
,
724 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
726 FIXME("(%p, %s, %p)\n", This
, debugstr_variant(result
), ei
);
731 static HRESULT WINAPI
ActiveScriptSite_OnStateChange(IActiveScriptSite
*iface
, SCRIPTSTATE state
)
733 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
735 FIXME("(%p, %d)\n", This
, state
);
740 static HRESULT WINAPI
ActiveScriptSite_OnScriptError(IActiveScriptSite
*iface
, IActiveScriptError
*script_error
)
742 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
744 TRACE("(%p, %p)\n", This
, script_error
);
748 IScriptError_Clear(&This
->error
->IScriptError_iface
);
749 IActiveScriptError_AddRef(script_error
);
750 This
->error
->object
= script_error
;
755 static HRESULT WINAPI
ActiveScriptSite_OnEnterScript(IActiveScriptSite
*iface
)
757 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
759 FIXME("(%p)\n", This
);
764 static HRESULT WINAPI
ActiveScriptSite_OnLeaveScript(IActiveScriptSite
*iface
)
766 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
768 FIXME("(%p)\n", This
);
773 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl
= {
774 ActiveScriptSite_QueryInterface
,
775 ActiveScriptSite_AddRef
,
776 ActiveScriptSite_Release
,
777 ActiveScriptSite_GetLCID
,
778 ActiveScriptSite_GetItemInfo
,
779 ActiveScriptSite_GetDocVersionString
,
780 ActiveScriptSite_OnScriptTerminate
,
781 ActiveScriptSite_OnStateChange
,
782 ActiveScriptSite_OnScriptError
,
783 ActiveScriptSite_OnEnterScript
,
784 ActiveScriptSite_OnLeaveScript
787 /* IActiveScriptSiteWindow */
788 static HRESULT WINAPI
ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow
*iface
, REFIID riid
, void **obj
)
790 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
791 return IActiveScriptSite_QueryInterface(&This
->IActiveScriptSite_iface
, riid
, obj
);
794 static ULONG WINAPI
ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow
*iface
)
796 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
797 return IActiveScriptSite_AddRef(&This
->IActiveScriptSite_iface
);
800 static ULONG WINAPI
ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow
*iface
)
802 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
803 return IActiveScriptSite_Release(&This
->IActiveScriptSite_iface
);
806 static HRESULT WINAPI
ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow
*iface
, HWND
*hwnd
)
808 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
810 TRACE("(%p, %p)\n", This
, hwnd
);
812 if (!hwnd
) return E_POINTER
;
813 if (This
->site_hwnd
== ((HWND
)-1)) return E_FAIL
;
815 *hwnd
= This
->site_hwnd
;
819 static HRESULT WINAPI
ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow
*iface
, BOOL enable
)
821 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
823 FIXME("(%p, %d): stub\n", This
, enable
);
828 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl
= {
829 ActiveScriptSiteWindow_QueryInterface
,
830 ActiveScriptSiteWindow_AddRef
,
831 ActiveScriptSiteWindow_Release
,
832 ActiveScriptSiteWindow_GetWindow
,
833 ActiveScriptSiteWindow_EnableModeless
836 /* IServiceProvider */
837 static HRESULT WINAPI
ServiceProvider_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **obj
)
839 ScriptHost
*This
= impl_from_IServiceProvider(iface
);
840 return IActiveScriptSite_QueryInterface(&This
->IActiveScriptSite_iface
, riid
, obj
);
843 static ULONG WINAPI
ServiceProvider_AddRef(IServiceProvider
*iface
)
845 ScriptHost
*This
= impl_from_IServiceProvider(iface
);
846 return IActiveScriptSite_AddRef(&This
->IActiveScriptSite_iface
);
849 static ULONG WINAPI
ServiceProvider_Release(IServiceProvider
*iface
)
851 ScriptHost
*This
= impl_from_IServiceProvider(iface
);
852 return IActiveScriptSite_Release(&This
->IActiveScriptSite_iface
);
855 static HRESULT WINAPI
ServiceProvider_QueryService(IServiceProvider
*iface
, REFGUID service
,
856 REFIID riid
, void **obj
)
858 ScriptHost
*This
= impl_from_IServiceProvider(iface
);
860 FIXME("(%p)->(%s %s %p)\n", This
, debugstr_guid(service
), debugstr_guid(riid
), obj
);
865 static const IServiceProviderVtbl ServiceProviderVtbl
= {
866 ServiceProvider_QueryInterface
,
867 ServiceProvider_AddRef
,
868 ServiceProvider_Release
,
869 ServiceProvider_QueryService
872 static HRESULT WINAPI
ScriptProcedure_QueryInterface(IScriptProcedure
*iface
, REFIID riid
, void **ppv
)
874 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
876 if (IsEqualGUID(&IID_IDispatch
, riid
) || IsEqualGUID(&IID_IUnknown
, riid
) ||
877 IsEqualGUID(&IID_IScriptProcedure
, riid
))
879 *ppv
= &This
->IScriptProcedure_iface
;
883 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
885 return E_NOINTERFACE
;
888 IUnknown_AddRef((IUnknown
*)*ppv
);
892 static ULONG WINAPI
ScriptProcedure_AddRef(IScriptProcedure
*iface
)
894 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
895 LONG ref
= InterlockedIncrement(&This
->ref
);
897 TRACE("(%p) ref=%d\n", This
, ref
);
902 static ULONG WINAPI
ScriptProcedure_Release(IScriptProcedure
*iface
)
904 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
905 LONG ref
= InterlockedDecrement(&This
->ref
);
907 TRACE("(%p) ref=%d\n", This
, ref
);
911 list_remove(&This
->entry
);
912 SysFreeString(This
->name
);
918 static HRESULT WINAPI
ScriptProcedure_GetTypeInfoCount(IScriptProcedure
*iface
, UINT
*pctinfo
)
920 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
922 TRACE("(%p)->(%p)\n", This
, pctinfo
);
928 static HRESULT WINAPI
ScriptProcedure_GetTypeInfo(IScriptProcedure
*iface
, UINT iTInfo
,
929 LCID lcid
, ITypeInfo
**ppTInfo
)
931 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
933 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
935 return get_typeinfo(IScriptProcedure_tid
, ppTInfo
);
938 static HRESULT WINAPI
ScriptProcedure_GetIDsOfNames(IScriptProcedure
*iface
, REFIID riid
,
939 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
941 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
945 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
947 hr
= get_typeinfo(IScriptProcedure_tid
, &typeinfo
);
950 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
951 ITypeInfo_Release(typeinfo
);
957 static HRESULT WINAPI
ScriptProcedure_Invoke(IScriptProcedure
*iface
, DISPID dispIdMember
,
958 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
959 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
961 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
965 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
966 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
968 hr
= get_typeinfo(IScriptProcedure_tid
, &typeinfo
);
971 hr
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
972 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
973 ITypeInfo_Release(typeinfo
);
979 static HRESULT WINAPI
ScriptProcedure_get_Name(IScriptProcedure
*iface
, BSTR
*pbstrName
)
981 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
983 TRACE("(%p)->(%p)\n", This
, pbstrName
);
985 if (!pbstrName
) return E_POINTER
;
987 *pbstrName
= SysAllocString(This
->name
);
988 return *pbstrName
? S_OK
: E_OUTOFMEMORY
;
991 static HRESULT WINAPI
ScriptProcedure_get_NumArgs(IScriptProcedure
*iface
, LONG
*pcArgs
)
993 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
995 TRACE("(%p)->(%p)\n", This
, pcArgs
);
997 if (!pcArgs
) return E_POINTER
;
999 *pcArgs
= This
->num_args
;
1003 static HRESULT WINAPI
ScriptProcedure_get_HasReturnValue(IScriptProcedure
*iface
, VARIANT_BOOL
*pfHasReturnValue
)
1005 ScriptProcedure
*This
= impl_from_IScriptProcedure(iface
);
1007 TRACE("(%p)->(%p)\n", This
, pfHasReturnValue
);
1009 if (!pfHasReturnValue
) return E_POINTER
;
1011 *pfHasReturnValue
= (This
->ret_type
== VT_VOID
) ? VARIANT_FALSE
: VARIANT_TRUE
;
1015 static const IScriptProcedureVtbl ScriptProcedureVtbl
= {
1016 ScriptProcedure_QueryInterface
,
1017 ScriptProcedure_AddRef
,
1018 ScriptProcedure_Release
,
1019 ScriptProcedure_GetTypeInfoCount
,
1020 ScriptProcedure_GetTypeInfo
,
1021 ScriptProcedure_GetIDsOfNames
,
1022 ScriptProcedure_Invoke
,
1023 ScriptProcedure_get_Name
,
1024 ScriptProcedure_get_NumArgs
,
1025 ScriptProcedure_get_HasReturnValue
1028 /* This function always releases the FUNCDESC passed in */
1029 static HRESULT
get_script_procedure(ScriptProcedureCollection
*procedures
, ITypeInfo
*typeinfo
,
1030 FUNCDESC
*desc
, IScriptProcedure
**procedure
)
1032 struct list
*proc_list
;
1033 ScriptProcedure
*proc
;
1039 hr
= ITypeInfo_GetNames(typeinfo
, desc
->memid
, &str
, 1, &len
);
1040 if (FAILED(hr
)) goto done
;
1042 len
= SysStringLen(str
);
1043 hash
= LHashValOfNameSys(sizeof(void*) == 8 ? SYS_WIN64
: SYS_WIN32
, LOCALE_USER_DEFAULT
, str
);
1044 proc_list
= &procedures
->hash_table
[hash
% ARRAY_SIZE(procedures
->hash_table
)];
1046 /* Try to find it in the hash table */
1047 LIST_FOR_EACH_ENTRY(proc
, proc_list
, ScriptProcedure
, entry
)
1049 if (proc
->hash
== hash
&& SysStringLen(proc
->name
) == len
&&
1050 !memcmp(proc
->name
, str
, len
* sizeof(*str
)))
1053 IScriptProcedure_AddRef(&proc
->IScriptProcedure_iface
);
1054 *procedure
= &proc
->IScriptProcedure_iface
;
1059 if (!(proc
= heap_alloc(sizeof(*proc
))))
1066 proc
->IScriptProcedure_iface
.lpVtbl
= &ScriptProcedureVtbl
;
1070 proc
->num_args
= desc
->cParams
+ desc
->cParamsOpt
;
1071 proc
->ret_type
= desc
->elemdescFunc
.tdesc
.vt
;
1072 list_add_tail(proc_list
, &proc
->entry
);
1074 *procedure
= &proc
->IScriptProcedure_iface
;
1077 ITypeInfo_ReleaseFuncDesc(typeinfo
, desc
);
1081 static HRESULT WINAPI
procedure_enum_QueryInterface(IEnumVARIANT
*iface
, REFIID riid
, void **ppv
)
1083 struct procedure_enum
*This
= procedure_enum_from_IEnumVARIANT(iface
);
1085 if (IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IEnumVARIANT
, riid
))
1087 *ppv
= &This
->IEnumVARIANT_iface
;
1091 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
1093 return E_NOINTERFACE
;
1096 IUnknown_AddRef((IUnknown
*)*ppv
);
1100 static ULONG WINAPI
procedure_enum_AddRef(IEnumVARIANT
*iface
)
1102 struct procedure_enum
*This
= procedure_enum_from_IEnumVARIANT(iface
);
1103 LONG ref
= InterlockedIncrement(&This
->ref
);
1105 TRACE("(%p) ref=%d\n", This
, ref
);
1110 static ULONG WINAPI
procedure_enum_Release(IEnumVARIANT
*iface
)
1112 struct procedure_enum
*This
= procedure_enum_from_IEnumVARIANT(iface
);
1113 LONG ref
= InterlockedDecrement(&This
->ref
);
1115 TRACE("(%p) ref=%d\n", This
, ref
);
1119 IScriptProcedureCollection_Release(&This
->procedures
->IScriptProcedureCollection_iface
);
1126 static HRESULT WINAPI
procedure_enum_Next(IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*rgVar
, ULONG
*pCeltFetched
)
1128 struct procedure_enum
*This
= procedure_enum_from_IEnumVARIANT(iface
);
1134 TRACE("(%p)->(%u %p %p)\n", This
, celt
, rgVar
, pCeltFetched
);
1136 if (!rgVar
) return E_POINTER
;
1137 if (!This
->procedures
->module
->host
) return E_FAIL
;
1139 hr
= start_script(This
->procedures
->module
);
1140 if (FAILED(hr
)) return hr
;
1142 hr
= get_script_typeinfo(This
->procedures
->module
, &ti
);
1143 if (FAILED(hr
)) return hr
;
1145 num
= min(celt
, This
->count
- This
->pos
);
1146 for (i
= 0; i
< num
; i
++)
1148 hr
= ITypeInfo_GetFuncDesc(ti
, This
->pos
+ i
, &desc
);
1149 if (FAILED(hr
)) break;
1151 hr
= get_script_procedure(This
->procedures
, ti
, desc
, (IScriptProcedure
**)&V_DISPATCH(rgVar
+ i
));
1152 if (FAILED(hr
)) break;
1154 V_VT(rgVar
+ i
) = VT_DISPATCH
;
1160 VariantClear(rgVar
+ i
);
1161 if (pCeltFetched
) *pCeltFetched
= 0;
1167 if (pCeltFetched
) *pCeltFetched
= i
;
1168 return i
== celt
? S_OK
: S_FALSE
;
1171 static HRESULT WINAPI
procedure_enum_Skip(IEnumVARIANT
*iface
, ULONG celt
)
1173 struct procedure_enum
*This
= procedure_enum_from_IEnumVARIANT(iface
);
1175 TRACE("(%p)->(%u)\n", This
, celt
);
1177 if (This
->count
- This
->pos
< celt
)
1179 This
->pos
= This
->count
;
1186 static HRESULT WINAPI
procedure_enum_Reset(IEnumVARIANT
*iface
)
1188 struct procedure_enum
*This
= procedure_enum_from_IEnumVARIANT(iface
);
1190 TRACE("(%p)\n", This
);
1196 static HRESULT WINAPI
procedure_enum_Clone(IEnumVARIANT
*iface
, IEnumVARIANT
**ppEnum
)
1198 struct procedure_enum
*This
= procedure_enum_from_IEnumVARIANT(iface
);
1199 struct procedure_enum
*clone
;
1201 TRACE("(%p)->(%p)\n", This
, ppEnum
);
1203 if (!ppEnum
) return E_POINTER
;
1205 if (!(clone
= heap_alloc(sizeof(*clone
))))
1206 return E_OUTOFMEMORY
;
1210 IScriptProcedureCollection_AddRef(&This
->procedures
->IScriptProcedureCollection_iface
);
1212 *ppEnum
= &clone
->IEnumVARIANT_iface
;
1216 static const IEnumVARIANTVtbl procedure_enum_vtbl
= {
1217 procedure_enum_QueryInterface
,
1218 procedure_enum_AddRef
,
1219 procedure_enum_Release
,
1220 procedure_enum_Next
,
1221 procedure_enum_Skip
,
1222 procedure_enum_Reset
,
1223 procedure_enum_Clone
1226 static HRESULT WINAPI
ScriptProcedureCollection_QueryInterface(IScriptProcedureCollection
*iface
, REFIID riid
, void **ppv
)
1228 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1230 if (IsEqualGUID(&IID_IDispatch
, riid
) || IsEqualGUID(&IID_IUnknown
, riid
) ||
1231 IsEqualGUID(&IID_IScriptProcedureCollection
, riid
))
1233 *ppv
= &This
->IScriptProcedureCollection_iface
;
1237 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
1239 return E_NOINTERFACE
;
1242 IUnknown_AddRef((IUnknown
*)*ppv
);
1246 static ULONG WINAPI
ScriptProcedureCollection_AddRef(IScriptProcedureCollection
*iface
)
1248 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1249 LONG ref
= InterlockedIncrement(&This
->ref
);
1251 TRACE("(%p) ref=%d\n", This
, ref
);
1256 static ULONG WINAPI
ScriptProcedureCollection_Release(IScriptProcedureCollection
*iface
)
1258 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1259 LONG ref
= InterlockedDecrement(&This
->ref
);
1262 TRACE("(%p) ref=%d\n", This
, ref
);
1266 /* Unlink any dangling items from the hash table */
1267 for (i
= 0; i
< ARRAY_SIZE(This
->hash_table
); i
++)
1268 list_remove(&This
->hash_table
[i
]);
1270 This
->module
->procedures
= NULL
;
1271 IScriptModule_Release(&This
->module
->IScriptModule_iface
);
1277 static HRESULT WINAPI
ScriptProcedureCollection_GetTypeInfoCount(IScriptProcedureCollection
*iface
, UINT
*pctinfo
)
1279 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1281 TRACE("(%p)->(%p)\n", This
, pctinfo
);
1287 static HRESULT WINAPI
ScriptProcedureCollection_GetTypeInfo(IScriptProcedureCollection
*iface
, UINT iTInfo
,
1288 LCID lcid
, ITypeInfo
**ppTInfo
)
1290 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1292 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1294 return get_typeinfo(IScriptProcedureCollection_tid
, ppTInfo
);
1297 static HRESULT WINAPI
ScriptProcedureCollection_GetIDsOfNames(IScriptProcedureCollection
*iface
, REFIID riid
,
1298 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1300 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1301 ITypeInfo
*typeinfo
;
1304 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
1306 hr
= get_typeinfo(IScriptProcedureCollection_tid
, &typeinfo
);
1309 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1310 ITypeInfo_Release(typeinfo
);
1316 static HRESULT WINAPI
ScriptProcedureCollection_Invoke(IScriptProcedureCollection
*iface
, DISPID dispIdMember
,
1317 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
1318 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1320 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1321 ITypeInfo
*typeinfo
;
1324 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1325 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1327 hr
= get_typeinfo(IScriptProcedureCollection_tid
, &typeinfo
);
1330 hr
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
1331 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1332 ITypeInfo_Release(typeinfo
);
1338 static HRESULT WINAPI
ScriptProcedureCollection_get__NewEnum(IScriptProcedureCollection
*iface
, IUnknown
**ppenumProcedures
)
1340 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1341 struct procedure_enum
*proc_enum
;
1347 TRACE("(%p)->(%p)\n", This
, ppenumProcedures
);
1349 if (!ppenumProcedures
) return E_POINTER
;
1350 if (!This
->module
->host
) return E_FAIL
;
1352 hr
= start_script(This
->module
);
1353 if (FAILED(hr
)) return hr
;
1355 hr
= get_script_typeinfo(This
->module
, &ti
);
1356 if (FAILED(hr
)) return hr
;
1358 hr
= ITypeInfo_GetTypeAttr(ti
, &attr
);
1359 if (FAILED(hr
)) return hr
;
1361 count
= attr
->cFuncs
;
1362 ITypeInfo_ReleaseTypeAttr(ti
, attr
);
1364 if (!(proc_enum
= heap_alloc(sizeof(*proc_enum
))))
1365 return E_OUTOFMEMORY
;
1367 proc_enum
->IEnumVARIANT_iface
.lpVtbl
= &procedure_enum_vtbl
;
1370 proc_enum
->count
= count
;
1371 proc_enum
->procedures
= This
;
1372 IScriptProcedureCollection_AddRef(&This
->IScriptProcedureCollection_iface
);
1374 *ppenumProcedures
= (IUnknown
*)&proc_enum
->IEnumVARIANT_iface
;
1378 static HRESULT WINAPI
ScriptProcedureCollection_get_Item(IScriptProcedureCollection
*iface
, VARIANT index
,
1379 IScriptProcedure
**ppdispProcedure
)
1381 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1382 ITypeInfo
*typeinfo
;
1386 TRACE("(%p)->(%s %p)\n", This
, wine_dbgstr_variant(&index
), ppdispProcedure
);
1388 if (!ppdispProcedure
) return E_POINTER
;
1389 if (!This
->module
->host
) return E_FAIL
;
1391 hr
= start_script(This
->module
);
1392 if (FAILED(hr
)) return hr
;
1394 hr
= get_script_typeinfo(This
->module
, &typeinfo
);
1395 if (FAILED(hr
)) return hr
;
1397 if (V_VT(&index
) == VT_BSTR
)
1399 struct list
*proc_list
;
1400 ScriptProcedure
*proc
;
1407 len
= SysStringLen(V_BSTR(&index
));
1408 hash
= LHashValOfNameSys(sizeof(void*) == 8 ? SYS_WIN64
: SYS_WIN32
, LOCALE_USER_DEFAULT
, V_BSTR(&index
));
1409 proc_list
= &This
->hash_table
[hash
% ARRAY_SIZE(This
->hash_table
)];
1411 /* Try to find it in the hash table */
1412 LIST_FOR_EACH_ENTRY(proc
, proc_list
, ScriptProcedure
, entry
)
1414 if (proc
->hash
== hash
&& SysStringLen(proc
->name
) == len
&&
1415 !memcmp(proc
->name
, V_BSTR(&index
), len
* sizeof(WCHAR
)))
1417 IScriptProcedure_AddRef(&proc
->IScriptProcedure_iface
);
1418 *ppdispProcedure
= &proc
->IScriptProcedure_iface
;
1423 hr
= get_script_typecomp(This
->module
, typeinfo
, &comp
);
1424 if (FAILED(hr
)) return hr
;
1426 hr
= ITypeComp_Bind(comp
, V_BSTR(&index
), hash
, INVOKE_FUNC
, &typeinfo
, &kind
, &bindptr
);
1427 if (FAILED(hr
)) return hr
;
1431 case DESCKIND_FUNCDESC
:
1432 hr
= get_script_procedure(This
, typeinfo
, bindptr
.lpfuncdesc
, ppdispProcedure
);
1433 ITypeInfo_Release(typeinfo
);
1435 case DESCKIND_IMPLICITAPPOBJ
:
1436 case DESCKIND_VARDESC
:
1437 ITypeInfo_ReleaseVarDesc(typeinfo
, bindptr
.lpvardesc
);
1438 ITypeInfo_Release(typeinfo
);
1440 case DESCKIND_TYPECOMP
:
1441 ITypeComp_Release(bindptr
.lptcomp
);
1446 return CTL_E_ILLEGALFUNCTIONCALL
;
1449 hr
= VariantChangeType(&index
, &index
, 0, VT_INT
);
1450 if (FAILED(hr
)) return hr
;
1451 if (V_INT(&index
) <= 0) return 0x800a0009;
1453 hr
= ITypeInfo_GetFuncDesc(typeinfo
, V_INT(&index
) - 1, &desc
);
1454 if (FAILED(hr
)) return hr
;
1456 return get_script_procedure(This
, typeinfo
, desc
, ppdispProcedure
);
1459 static HRESULT WINAPI
ScriptProcedureCollection_get_Count(IScriptProcedureCollection
*iface
, LONG
*plCount
)
1461 ScriptProcedureCollection
*This
= impl_from_IScriptProcedureCollection(iface
);
1466 TRACE("(%p)->(%p)\n", This
, plCount
);
1468 if (!plCount
) return E_POINTER
;
1469 if (!This
->module
->host
) return E_FAIL
;
1471 if (This
->count
== -1)
1473 hr
= start_script(This
->module
);
1474 if (FAILED(hr
)) return hr
;
1476 hr
= get_script_typeinfo(This
->module
, &ti
);
1477 if (FAILED(hr
)) return hr
;
1479 hr
= ITypeInfo_GetTypeAttr(ti
, &attr
);
1480 if (FAILED(hr
)) return hr
;
1482 This
->count
= attr
->cFuncs
;
1483 ITypeInfo_ReleaseTypeAttr(ti
, attr
);
1486 *plCount
= This
->count
;
1490 static const IScriptProcedureCollectionVtbl ScriptProcedureCollectionVtbl
= {
1491 ScriptProcedureCollection_QueryInterface
,
1492 ScriptProcedureCollection_AddRef
,
1493 ScriptProcedureCollection_Release
,
1494 ScriptProcedureCollection_GetTypeInfoCount
,
1495 ScriptProcedureCollection_GetTypeInfo
,
1496 ScriptProcedureCollection_GetIDsOfNames
,
1497 ScriptProcedureCollection_Invoke
,
1498 ScriptProcedureCollection_get__NewEnum
,
1499 ScriptProcedureCollection_get_Item
,
1500 ScriptProcedureCollection_get_Count
1503 static void detach_script_host(ScriptHost
*host
)
1505 if (--host
->module_count
)
1509 IActiveScript_Close(host
->script
);
1510 IActiveScript_Release(host
->script
);
1514 IActiveScriptParse_Release(host
->parse
);
1517 IScriptError_Release(&host
->error
->IScriptError_iface
);
1521 host
->script
= NULL
;
1524 static void detach_module(ScriptModule
*module
)
1526 ScriptHost
*host
= module
->host
;
1529 module
->host
= NULL
;
1530 detach_script_host(host
);
1531 IActiveScriptSite_Release(&host
->IActiveScriptSite_iface
);
1535 static HRESULT WINAPI
ScriptModule_QueryInterface(IScriptModule
*iface
, REFIID riid
, void **ppv
)
1537 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1539 if (IsEqualGUID(&IID_IDispatch
, riid
) || IsEqualGUID(&IID_IUnknown
, riid
) ||
1540 IsEqualGUID(&IID_IScriptModule
, riid
))
1542 *ppv
= &This
->IScriptModule_iface
;
1546 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
1548 return E_NOINTERFACE
;
1551 IUnknown_AddRef((IUnknown
*)*ppv
);
1555 static ULONG WINAPI
ScriptModule_AddRef(IScriptModule
*iface
)
1557 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1558 LONG ref
= InterlockedIncrement(&This
->ref
);
1560 TRACE("(%p) ref=%d\n", This
, ref
);
1565 static ULONG WINAPI
ScriptModule_Release(IScriptModule
*iface
)
1567 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1568 LONG ref
= InterlockedDecrement(&This
->ref
);
1570 TRACE("(%p) ref=%d\n", This
, ref
);
1574 detach_module(This
);
1575 SysFreeString(This
->name
);
1576 uncache_module_objects(This
);
1583 static HRESULT WINAPI
ScriptModule_GetTypeInfoCount(IScriptModule
*iface
, UINT
*pctinfo
)
1585 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1587 TRACE("(%p)->(%p)\n", This
, pctinfo
);
1593 static HRESULT WINAPI
ScriptModule_GetTypeInfo(IScriptModule
*iface
, UINT iTInfo
,
1594 LCID lcid
, ITypeInfo
**ppTInfo
)
1596 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1598 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1600 return get_typeinfo(IScriptModule_tid
, ppTInfo
);
1603 static HRESULT WINAPI
ScriptModule_GetIDsOfNames(IScriptModule
*iface
, REFIID riid
,
1604 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1606 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1607 ITypeInfo
*typeinfo
;
1610 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
1612 hr
= get_typeinfo(IScriptModule_tid
, &typeinfo
);
1615 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1616 ITypeInfo_Release(typeinfo
);
1622 static HRESULT WINAPI
ScriptModule_Invoke(IScriptModule
*iface
, DISPID dispIdMember
,
1623 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
1624 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1626 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1627 ITypeInfo
*typeinfo
;
1630 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1631 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1633 hr
= get_typeinfo(IScriptModule_tid
, &typeinfo
);
1636 hr
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
1637 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1638 ITypeInfo_Release(typeinfo
);
1644 static HRESULT WINAPI
ScriptModule_get_Name(IScriptModule
*iface
, BSTR
*pbstrName
)
1646 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1648 TRACE("(%p)->(%p)\n", This
, pbstrName
);
1650 if (!pbstrName
) return E_POINTER
;
1651 if (!This
->host
) return E_FAIL
;
1653 *pbstrName
= SysAllocString(This
->name
? This
->name
: L
"Global");
1654 return *pbstrName
? S_OK
: E_OUTOFMEMORY
;
1657 static HRESULT WINAPI
ScriptModule_get_CodeObject(IScriptModule
*iface
, IDispatch
**ppdispObject
)
1659 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1662 TRACE("(%p)->(%p)\n", This
, ppdispObject
);
1664 if (!This
->host
) return E_FAIL
;
1666 hr
= start_script(This
);
1667 if (FAILED(hr
)) return hr
;
1669 hr
= get_script_dispatch(This
, ppdispObject
);
1670 if (FAILED(hr
)) return hr
;
1672 IDispatch_AddRef(*ppdispObject
);
1676 static HRESULT WINAPI
ScriptModule_get_Procedures(IScriptModule
*iface
, IScriptProcedureCollection
**ppdispProcedures
)
1678 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1680 TRACE("(%p)->(%p)\n", This
, ppdispProcedures
);
1685 if (This
->procedures
)
1686 IScriptProcedureCollection_AddRef(&This
->procedures
->IScriptProcedureCollection_iface
);
1689 ScriptProcedureCollection
*procs
;
1692 if (!(procs
= heap_alloc(sizeof(*procs
))))
1693 return E_OUTOFMEMORY
;
1695 procs
->IScriptProcedureCollection_iface
.lpVtbl
= &ScriptProcedureCollectionVtbl
;
1698 procs
->module
= This
;
1699 for (i
= 0; i
< ARRAY_SIZE(procs
->hash_table
); i
++)
1700 list_init(&procs
->hash_table
[i
]);
1702 This
->procedures
= procs
;
1703 IScriptModule_AddRef(&This
->IScriptModule_iface
);
1706 *ppdispProcedures
= &This
->procedures
->IScriptProcedureCollection_iface
;
1710 static HRESULT WINAPI
ScriptModule_AddCode(IScriptModule
*iface
, BSTR code
)
1712 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1714 TRACE("(%p)->(%s)\n", This
, debugstr_w(code
));
1719 return parse_script_text(This
, code
, SCRIPTTEXT_ISVISIBLE
, NULL
);
1722 static HRESULT WINAPI
ScriptModule_Eval(IScriptModule
*iface
, BSTR expression
, VARIANT
*res
)
1724 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1726 TRACE("(%p)->(%s, %p)\n", This
, debugstr_w(expression
), res
);
1730 V_VT(res
) = VT_EMPTY
;
1734 return parse_script_text(This
, expression
, SCRIPTTEXT_ISEXPRESSION
, res
);
1737 static HRESULT WINAPI
ScriptModule_ExecuteStatement(IScriptModule
*iface
, BSTR statement
)
1739 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1741 TRACE("(%p)->(%s)\n", This
, debugstr_w(statement
));
1746 return parse_script_text(This
, statement
, 0, NULL
);
1749 static HRESULT WINAPI
ScriptModule_Run(IScriptModule
*iface
, BSTR procedure_name
, SAFEARRAY
**parameters
, VARIANT
*res
)
1751 ScriptModule
*This
= impl_from_IScriptModule(iface
);
1754 TRACE("(%p)->(%s %p %p)\n", This
, debugstr_w(procedure_name
), parameters
, res
);
1756 if (!parameters
|| !res
) return E_POINTER
;
1757 if (!(sa
= *parameters
)) return E_POINTER
;
1759 V_VT(res
) = VT_EMPTY
;
1760 if (sa
->cDims
== 0) return DISP_E_BADINDEX
;
1761 if (!(sa
->fFeatures
& FADF_VARIANT
)) return DISP_E_BADVARTYPE
;
1762 if (!This
->host
) return E_FAIL
;
1764 return run_procedure(This
, procedure_name
, sa
, res
);
1767 static const IScriptModuleVtbl ScriptModuleVtbl
= {
1768 ScriptModule_QueryInterface
,
1769 ScriptModule_AddRef
,
1770 ScriptModule_Release
,
1771 ScriptModule_GetTypeInfoCount
,
1772 ScriptModule_GetTypeInfo
,
1773 ScriptModule_GetIDsOfNames
,
1774 ScriptModule_Invoke
,
1775 ScriptModule_get_Name
,
1776 ScriptModule_get_CodeObject
,
1777 ScriptModule_get_Procedures
,
1778 ScriptModule_AddCode
,
1780 ScriptModule_ExecuteStatement
,
1784 static HRESULT WINAPI
module_enum_QueryInterface(IEnumVARIANT
*iface
, REFIID riid
, void **ppv
)
1786 struct module_enum
*This
= module_enum_from_IEnumVARIANT(iface
);
1788 if (IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IEnumVARIANT
, riid
))
1790 *ppv
= &This
->IEnumVARIANT_iface
;
1794 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
1796 return E_NOINTERFACE
;
1799 IUnknown_AddRef((IUnknown
*)*ppv
);
1803 static ULONG WINAPI
module_enum_AddRef(IEnumVARIANT
*iface
)
1805 struct module_enum
*This
= module_enum_from_IEnumVARIANT(iface
);
1806 LONG ref
= InterlockedIncrement(&This
->ref
);
1808 TRACE("(%p) ref=%d\n", This
, ref
);
1813 static ULONG WINAPI
module_enum_Release(IEnumVARIANT
*iface
)
1815 struct module_enum
*This
= module_enum_from_IEnumVARIANT(iface
);
1816 LONG ref
= InterlockedDecrement(&This
->ref
);
1818 TRACE("(%p) ref=%d\n", This
, ref
);
1822 IActiveScriptSite_Release(&This
->host
->IActiveScriptSite_iface
);
1823 IScriptControl_Release(&This
->control
->IScriptControl_iface
);
1830 static HRESULT WINAPI
module_enum_Next(IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*rgVar
, ULONG
*pCeltFetched
)
1832 struct module_enum
*This
= module_enum_from_IEnumVARIANT(iface
);
1833 unsigned int i
, num
;
1835 TRACE("(%p)->(%u %p %p)\n", This
, celt
, rgVar
, pCeltFetched
);
1837 if (!rgVar
) return E_POINTER
;
1838 if (This
->host
!= This
->control
->host
) return E_FAIL
;
1840 num
= min(celt
, This
->host
->module_count
- This
->pos
);
1841 for (i
= 0; i
< num
; i
++)
1843 V_VT(rgVar
+ i
) = VT_DISPATCH
;
1844 V_DISPATCH(rgVar
+ i
) = (IDispatch
*)(&This
->control
->modules
[This
->pos
++]->IScriptModule_iface
);
1845 IDispatch_AddRef(V_DISPATCH(rgVar
+ i
));
1848 if (pCeltFetched
) *pCeltFetched
= i
;
1849 return i
== celt
? S_OK
: S_FALSE
;
1852 static HRESULT WINAPI
module_enum_Skip(IEnumVARIANT
*iface
, ULONG celt
)
1854 struct module_enum
*This
= module_enum_from_IEnumVARIANT(iface
);
1856 TRACE("(%p)->(%u)\n", This
, celt
);
1858 if (This
->host
!= This
->control
->host
) return E_FAIL
;
1860 if (This
->host
->module_count
- This
->pos
< celt
)
1862 This
->pos
= This
->host
->module_count
;
1869 static HRESULT WINAPI
module_enum_Reset(IEnumVARIANT
*iface
)
1871 struct module_enum
*This
= module_enum_from_IEnumVARIANT(iface
);
1873 TRACE("(%p)\n", This
);
1875 if (This
->host
!= This
->control
->host
) return E_FAIL
;
1881 static HRESULT WINAPI
module_enum_Clone(IEnumVARIANT
*iface
, IEnumVARIANT
**ppEnum
)
1883 struct module_enum
*This
= module_enum_from_IEnumVARIANT(iface
);
1884 struct module_enum
*clone
;
1886 TRACE("(%p)->(%p)\n", This
, ppEnum
);
1888 if (!ppEnum
) return E_POINTER
;
1889 if (This
->host
!= This
->control
->host
) return E_FAIL
;
1891 if (!(clone
= heap_alloc(sizeof(*clone
))))
1892 return E_OUTOFMEMORY
;
1896 IActiveScriptSite_AddRef(&This
->host
->IActiveScriptSite_iface
);
1897 IScriptControl_AddRef(&This
->control
->IScriptControl_iface
);
1899 *ppEnum
= &clone
->IEnumVARIANT_iface
;
1903 static const IEnumVARIANTVtbl module_enum_vtbl
= {
1904 module_enum_QueryInterface
,
1906 module_enum_Release
,
1913 static ScriptModule
*create_module(ScriptHost
*host
, BSTR name
)
1915 ScriptModule
*module
;
1917 if (!(module
= heap_alloc_zero(sizeof(*module
)))) return NULL
;
1919 module
->IScriptModule_iface
.lpVtbl
= &ScriptModuleVtbl
;
1921 if (name
&& !(module
->name
= SysAllocString(name
)))
1926 module
->host
= host
;
1927 IActiveScriptSite_AddRef(&host
->IActiveScriptSite_iface
);
1931 static void release_modules(ScriptControl
*control
, BOOL force_detach
)
1933 unsigned int i
, module_count
= control
->host
->module_count
;
1935 for (i
= 0; i
< module_count
; i
++) {
1936 if (force_detach
) detach_module(control
->modules
[i
]);
1937 IScriptModule_Release(&control
->modules
[i
]->IScriptModule_iface
);
1940 heap_free(control
->modules
);
1943 static ScriptModule
*find_module(ScriptControl
*control
, BSTR name
)
1947 if (!wcsicmp(name
, L
"Global"))
1948 return control
->modules
[0];
1950 for (i
= 1; i
< control
->host
->module_count
; i
++)
1952 if (!wcsicmp(name
, control
->modules
[i
]->name
))
1953 return control
->modules
[i
];
1958 static HRESULT WINAPI
ScriptModuleCollection_QueryInterface(IScriptModuleCollection
*iface
, REFIID riid
, void **ppv
)
1960 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
1962 if (IsEqualGUID(&IID_IDispatch
, riid
) || IsEqualGUID(&IID_IUnknown
, riid
) ||
1963 IsEqualGUID(&IID_IScriptModuleCollection
, riid
))
1965 *ppv
= &This
->IScriptModuleCollection_iface
;
1969 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
1971 return E_NOINTERFACE
;
1974 IUnknown_AddRef((IUnknown
*)*ppv
);
1978 static ULONG WINAPI
ScriptModuleCollection_AddRef(IScriptModuleCollection
*iface
)
1980 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
1981 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
1984 static ULONG WINAPI
ScriptModuleCollection_Release(IScriptModuleCollection
*iface
)
1986 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
1987 return IScriptControl_Release(&This
->IScriptControl_iface
);
1990 static HRESULT WINAPI
ScriptModuleCollection_GetTypeInfoCount(IScriptModuleCollection
*iface
, UINT
*pctinfo
)
1992 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
1994 TRACE("(%p)->(%p)\n", This
, pctinfo
);
2000 static HRESULT WINAPI
ScriptModuleCollection_GetTypeInfo(IScriptModuleCollection
*iface
, UINT iTInfo
,
2001 LCID lcid
, ITypeInfo
**ppTInfo
)
2003 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
2005 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
2007 return get_typeinfo(IScriptModuleCollection_tid
, ppTInfo
);
2010 static HRESULT WINAPI
ScriptModuleCollection_GetIDsOfNames(IScriptModuleCollection
*iface
, REFIID riid
,
2011 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2013 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
2014 ITypeInfo
*typeinfo
;
2017 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
2019 hr
= get_typeinfo(IScriptModuleCollection_tid
, &typeinfo
);
2022 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
2023 ITypeInfo_Release(typeinfo
);
2029 static HRESULT WINAPI
ScriptModuleCollection_Invoke(IScriptModuleCollection
*iface
, DISPID dispIdMember
,
2030 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
2031 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2033 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
2034 ITypeInfo
*typeinfo
;
2037 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
2038 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2040 hr
= get_typeinfo(IScriptModuleCollection_tid
, &typeinfo
);
2043 hr
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
2044 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2045 ITypeInfo_Release(typeinfo
);
2051 static HRESULT WINAPI
ScriptModuleCollection_get__NewEnum(IScriptModuleCollection
*iface
, IUnknown
**ppenumContexts
)
2053 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
2054 struct module_enum
*module_enum
;
2056 TRACE("(%p)->(%p)\n", This
, ppenumContexts
);
2058 if (!ppenumContexts
) return E_POINTER
;
2059 if (!This
->host
) return E_FAIL
;
2061 if (!(module_enum
= heap_alloc(sizeof(*module_enum
))))
2062 return E_OUTOFMEMORY
;
2064 module_enum
->IEnumVARIANT_iface
.lpVtbl
= &module_enum_vtbl
;
2065 module_enum
->ref
= 1;
2066 module_enum
->pos
= 0;
2067 module_enum
->host
= This
->host
;
2068 module_enum
->control
= This
;
2069 IActiveScriptSite_AddRef(&This
->host
->IActiveScriptSite_iface
);
2070 IScriptControl_AddRef(&This
->IScriptControl_iface
);
2072 *ppenumContexts
= (IUnknown
*)&module_enum
->IEnumVARIANT_iface
;
2076 static HRESULT WINAPI
ScriptModuleCollection_get_Item(IScriptModuleCollection
*iface
, VARIANT index
,
2077 IScriptModule
**ppmod
)
2079 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
2080 ScriptModule
*module
;
2084 TRACE("(%p)->(%s %p)\n", This
, wine_dbgstr_variant(&index
), ppmod
);
2086 if (!ppmod
) return E_POINTER
;
2087 if (!This
->host
) return E_FAIL
;
2089 if (V_VT(&index
) == VT_BSTR
)
2091 module
= find_module(This
, V_BSTR(&index
));
2092 if (!module
) return CTL_E_ILLEGALFUNCTIONCALL
;
2096 hr
= VariantChangeType(&index
, &index
, 0, VT_INT
);
2097 if (FAILED(hr
)) return hr
;
2099 i
= V_INT(&index
) - 1;
2100 if (i
>= This
->host
->module_count
) return 0x800a0009;
2102 module
= This
->modules
[i
];
2105 *ppmod
= &module
->IScriptModule_iface
;
2106 IScriptModule_AddRef(*ppmod
);
2110 static HRESULT WINAPI
ScriptModuleCollection_get_Count(IScriptModuleCollection
*iface
, LONG
*plCount
)
2112 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
2114 TRACE("(%p)->(%p)\n", This
, plCount
);
2116 if (!plCount
) return E_POINTER
;
2117 if (!This
->host
) return E_FAIL
;
2119 *plCount
= This
->host
->module_count
;
2123 static HRESULT WINAPI
ScriptModuleCollection_Add(IScriptModuleCollection
*iface
, BSTR name
,
2124 VARIANT
*object
, IScriptModule
**ppmod
)
2126 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
2127 ScriptModule
*module
, **modules
;
2128 ScriptHost
*host
= This
->host
;
2131 TRACE("(%p)->(%s %s %p)\n", This
, wine_dbgstr_w(name
), wine_dbgstr_variant(object
), ppmod
);
2133 if (!ppmod
) return E_POINTER
;
2134 if (!name
|| V_VT(object
) != VT_DISPATCH
) return E_INVALIDARG
;
2135 if (!host
) return E_FAIL
;
2136 if (find_module(This
, name
)) return E_INVALIDARG
;
2138 /* See if we need to grow the array */
2139 if (is_power_of_2(host
->module_count
))
2141 modules
= heap_realloc(This
->modules
, host
->module_count
* 2 * sizeof(*This
->modules
));
2142 if (!modules
) return E_OUTOFMEMORY
;
2143 This
->modules
= modules
;
2146 if (!(module
= create_module(host
, name
)))
2147 return E_OUTOFMEMORY
;
2149 /* If no object, Windows only calls AddNamedItem without adding a NULL object */
2150 if (V_DISPATCH(object
))
2151 hr
= add_script_object(host
, name
, V_DISPATCH(object
), 0);
2153 hr
= IActiveScript_AddNamedItem(host
->script
, name
, SCRIPTITEM_CODEONLY
);
2157 IScriptModule_Release(&module
->IScriptModule_iface
);
2160 This
->modules
[host
->module_count
++] = module
;
2162 *ppmod
= &module
->IScriptModule_iface
;
2163 IScriptModule_AddRef(*ppmod
);
2167 static const IScriptModuleCollectionVtbl ScriptModuleCollectionVtbl
= {
2168 ScriptModuleCollection_QueryInterface
,
2169 ScriptModuleCollection_AddRef
,
2170 ScriptModuleCollection_Release
,
2171 ScriptModuleCollection_GetTypeInfoCount
,
2172 ScriptModuleCollection_GetTypeInfo
,
2173 ScriptModuleCollection_GetIDsOfNames
,
2174 ScriptModuleCollection_Invoke
,
2175 ScriptModuleCollection_get__NewEnum
,
2176 ScriptModuleCollection_get_Item
,
2177 ScriptModuleCollection_get_Count
,
2178 ScriptModuleCollection_Add
2181 static void fill_error_info(ScriptError
*error
)
2185 if (error
->info_filled
) return;
2186 error
->info_filled
= TRUE
;
2190 if (FAILED(IActiveScriptError_GetExceptionInfo(error
->object
, &info
)))
2192 if (info
.pfnDeferredFillIn
)
2193 info
.pfnDeferredFillIn(&info
);
2195 error
->number
= info
.scode
;
2196 error
->source
= info
.bstrSource
;
2197 error
->desc
= info
.bstrDescription
;
2198 error
->help_file
= info
.bstrHelpFile
;
2199 error
->help_context
= info
.dwHelpContext
;
2202 static void fill_error_text(ScriptError
*error
)
2204 if (error
->text_filled
) return;
2205 error
->text_filled
= TRUE
;
2208 IActiveScriptError_GetSourceLineText(error
->object
, &error
->text
);
2211 static void fill_error_pos(ScriptError
*error
)
2217 if (error
->pos_filled
) return;
2218 error
->pos_filled
= TRUE
;
2222 if (FAILED(IActiveScriptError_GetSourcePosition(error
->object
, &context
, &line
, &column
)))
2226 error
->column
= column
;
2229 static HRESULT WINAPI
ScriptError_QueryInterface(IScriptError
*iface
, REFIID riid
, void **ppv
)
2231 ScriptError
*This
= impl_from_IScriptError(iface
);
2233 if (IsEqualGUID(&IID_IDispatch
, riid
) || IsEqualGUID(&IID_IUnknown
, riid
) ||
2234 IsEqualGUID(&IID_IScriptError
, riid
))
2236 *ppv
= &This
->IScriptError_iface
;
2240 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
2242 return E_NOINTERFACE
;
2245 IUnknown_AddRef((IUnknown
*)*ppv
);
2249 static ULONG WINAPI
ScriptError_AddRef(IScriptError
*iface
)
2251 ScriptError
*This
= impl_from_IScriptError(iface
);
2252 LONG ref
= InterlockedIncrement(&This
->ref
);
2254 TRACE("(%p) ref=%d\n", This
, ref
);
2259 static ULONG WINAPI
ScriptError_Release(IScriptError
*iface
)
2261 ScriptError
*This
= impl_from_IScriptError(iface
);
2262 LONG ref
= InterlockedDecrement(&This
->ref
);
2264 TRACE("(%p) ref=%d\n", This
, ref
);
2268 IScriptError_Clear(&This
->IScriptError_iface
);
2275 static HRESULT WINAPI
ScriptError_GetTypeInfoCount(IScriptError
*iface
, UINT
*pctinfo
)
2277 ScriptError
*This
= impl_from_IScriptError(iface
);
2279 TRACE("(%p)->(%p)\n", This
, pctinfo
);
2285 static HRESULT WINAPI
ScriptError_GetTypeInfo(IScriptError
*iface
, UINT iTInfo
,
2286 LCID lcid
, ITypeInfo
**ppTInfo
)
2288 ScriptError
*This
= impl_from_IScriptError(iface
);
2290 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
2292 return get_typeinfo(IScriptError_tid
, ppTInfo
);
2295 static HRESULT WINAPI
ScriptError_GetIDsOfNames(IScriptError
*iface
, REFIID riid
,
2296 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2298 ScriptError
*This
= impl_from_IScriptError(iface
);
2299 ITypeInfo
*typeinfo
;
2302 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
2304 hr
= get_typeinfo(IScriptError_tid
, &typeinfo
);
2307 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
2308 ITypeInfo_Release(typeinfo
);
2314 static HRESULT WINAPI
ScriptError_Invoke(IScriptError
*iface
, DISPID dispIdMember
,
2315 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
2316 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2318 ScriptError
*This
= impl_from_IScriptError(iface
);
2319 ITypeInfo
*typeinfo
;
2322 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
2323 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2325 hr
= get_typeinfo(IScriptError_tid
, &typeinfo
);
2328 hr
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
2329 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2330 ITypeInfo_Release(typeinfo
);
2336 static HRESULT WINAPI
ScriptError_get_Number(IScriptError
*iface
, LONG
*plNumber
)
2338 ScriptError
*This
= impl_from_IScriptError(iface
);
2340 TRACE("(%p)->(%p)\n", This
, plNumber
);
2342 fill_error_info(This
);
2343 *plNumber
= This
->number
;
2347 static HRESULT WINAPI
ScriptError_get_Source(IScriptError
*iface
, BSTR
*pbstrSource
)
2349 ScriptError
*This
= impl_from_IScriptError(iface
);
2351 TRACE("(%p)->(%p)\n", This
, pbstrSource
);
2353 fill_error_info(This
);
2354 *pbstrSource
= SysAllocString(This
->source
);
2358 static HRESULT WINAPI
ScriptError_get_Description(IScriptError
*iface
, BSTR
*pbstrDescription
)
2360 ScriptError
*This
= impl_from_IScriptError(iface
);
2362 TRACE("(%p)->(%p)\n", This
, pbstrDescription
);
2364 fill_error_info(This
);
2365 *pbstrDescription
= SysAllocString(This
->desc
);
2369 static HRESULT WINAPI
ScriptError_get_HelpFile(IScriptError
*iface
, BSTR
*pbstrHelpFile
)
2371 ScriptError
*This
= impl_from_IScriptError(iface
);
2373 TRACE("(%p)->(%p)\n", This
, pbstrHelpFile
);
2375 fill_error_info(This
);
2376 *pbstrHelpFile
= SysAllocString(This
->help_file
);
2380 static HRESULT WINAPI
ScriptError_get_HelpContext(IScriptError
*iface
, LONG
*plHelpContext
)
2382 ScriptError
*This
= impl_from_IScriptError(iface
);
2384 TRACE("(%p)->(%p)\n", This
, plHelpContext
);
2386 fill_error_info(This
);
2387 *plHelpContext
= This
->help_context
;
2391 static HRESULT WINAPI
ScriptError_get_Text(IScriptError
*iface
, BSTR
*pbstrText
)
2393 ScriptError
*This
= impl_from_IScriptError(iface
);
2395 TRACE("(%p)->(%p)\n", This
, pbstrText
);
2397 fill_error_text(This
);
2398 *pbstrText
= SysAllocString(This
->text
);
2402 static HRESULT WINAPI
ScriptError_get_Line(IScriptError
*iface
, LONG
*plLine
)
2404 ScriptError
*This
= impl_from_IScriptError(iface
);
2406 TRACE("(%p)->(%p)\n", This
, plLine
);
2408 fill_error_pos(This
);
2409 *plLine
= This
->line
;
2413 static HRESULT WINAPI
ScriptError_get_Column(IScriptError
*iface
, LONG
*plColumn
)
2415 ScriptError
*This
= impl_from_IScriptError(iface
);
2417 TRACE("(%p)->(%p)\n", This
, plColumn
);
2419 fill_error_pos(This
);
2420 *plColumn
= This
->column
;
2424 static HRESULT WINAPI
ScriptError_Clear(IScriptError
*iface
)
2426 ScriptError
*This
= impl_from_IScriptError(iface
);
2428 TRACE("(%p)->()\n", This
);
2432 IActiveScriptError_Release(This
->object
);
2433 This
->object
= NULL
;
2435 SysFreeString(This
->text
);
2436 SysFreeString(This
->source
);
2437 SysFreeString(This
->desc
);
2438 SysFreeString(This
->help_file
);
2442 This
->source
= NULL
;
2444 This
->help_file
= NULL
;
2445 This
->help_context
= 0;
2449 This
->info_filled
= FALSE
;
2450 This
->text_filled
= FALSE
;
2451 This
->pos_filled
= FALSE
;
2455 static const IScriptErrorVtbl ScriptErrorVtbl
= {
2456 ScriptError_QueryInterface
,
2458 ScriptError_Release
,
2459 ScriptError_GetTypeInfoCount
,
2460 ScriptError_GetTypeInfo
,
2461 ScriptError_GetIDsOfNames
,
2463 ScriptError_get_Number
,
2464 ScriptError_get_Source
,
2465 ScriptError_get_Description
,
2466 ScriptError_get_HelpFile
,
2467 ScriptError_get_HelpContext
,
2468 ScriptError_get_Text
,
2469 ScriptError_get_Line
,
2470 ScriptError_get_Column
,
2474 static HRESULT
set_safety_opts(IActiveScript
*script
, VARIANT_BOOL use_safe_subset
)
2476 IObjectSafety
*objsafety
;
2479 hr
= IActiveScript_QueryInterface(script
, &IID_IObjectSafety
, (void**)&objsafety
);
2481 FIXME("Could not get IObjectSafety, %#x\n", hr
);
2485 hr
= IObjectSafety_SetInterfaceSafetyOptions(objsafety
, &IID_IActiveScriptParse
, INTERFACESAFE_FOR_UNTRUSTED_DATA
,
2486 use_safe_subset
? INTERFACESAFE_FOR_UNTRUSTED_DATA
: 0);
2487 IObjectSafety_Release(objsafety
);
2489 FIXME("SetInterfaceSafetyOptions failed, %#x\n", hr
);
2496 static HRESULT
init_script_host(ScriptControl
*control
, const CLSID
*clsid
, ScriptHost
**ret
)
2503 host
= heap_alloc(sizeof(*host
));
2505 return E_OUTOFMEMORY
;
2507 host
->IActiveScriptSite_iface
.lpVtbl
= &ActiveScriptSiteVtbl
;
2508 host
->IActiveScriptSiteWindow_iface
.lpVtbl
= &ActiveScriptSiteWindowVtbl
;
2509 host
->IServiceProvider_iface
.lpVtbl
= &ServiceProviderVtbl
;
2511 host
->script
= NULL
;
2513 host
->clsid
= *clsid
;
2514 host
->module_count
= 1;
2515 list_init(&host
->named_items
);
2517 hr
= CoCreateInstance(&host
->clsid
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
2518 &IID_IActiveScript
, (void**)&host
->script
);
2520 WARN("Failed to create an instance for %s, %#x\n", debugstr_guid(clsid
), hr
);
2524 hr
= set_safety_opts(host
->script
, control
->use_safe_subset
);
2525 if (FAILED(hr
)) goto failed
;
2527 hr
= IActiveScript_SetScriptSite(host
->script
, &host
->IActiveScriptSite_iface
);
2529 WARN("SetScriptSite failed, %#x\n", hr
);
2533 hr
= IActiveScript_QueryInterface(host
->script
, &IID_IActiveScriptParse
, (void**)&host
->parse
);
2535 WARN("Failed to get IActiveScriptParse, %#x\n", hr
);
2539 hr
= IActiveScriptParse_InitNew(host
->parse
);
2541 WARN("InitNew failed, %#x\n", hr
);
2544 host
->script_state
= SCRIPTSTATE_INITIALIZED
;
2545 host
->site_hwnd
= control
->allow_ui
? control
->site_hwnd
: ((HWND
)-1);
2546 host
->error
= control
->error
;
2547 IScriptError_AddRef(&host
->error
->IScriptError_iface
);
2553 detach_script_host(host
);
2557 static HRESULT WINAPI
ScriptControl_QueryInterface(IScriptControl
*iface
, REFIID riid
, void **ppv
)
2559 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2561 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
2562 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
2563 *ppv
= &This
->IScriptControl_iface
;
2564 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
2565 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
2566 *ppv
= &This
->IScriptControl_iface
;
2567 }else if(IsEqualGUID(&IID_IScriptControl
, riid
)) {
2568 TRACE("(%p)->(IID_IScriptControl %p)\n", This
, ppv
);
2569 *ppv
= &This
->IScriptControl_iface
;
2570 }else if(IsEqualGUID(&IID_IOleObject
, riid
)) {
2571 TRACE("(%p)->(IID_IOleObject %p)\n", This
, ppv
);
2572 *ppv
= &This
->IOleObject_iface
;
2573 }else if(IsEqualGUID(&IID_IPersistStreamInit
, riid
)) {
2574 TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This
, ppv
);
2575 *ppv
= &This
->IPersistStreamInit_iface
;
2576 }else if(IsEqualGUID(&IID_IPersist
, riid
)) {
2577 TRACE("(%p)->(IID_IPersist %p)\n", This
, ppv
);
2578 *ppv
= &This
->IPersistStreamInit_iface
;
2579 }else if(IsEqualGUID(&IID_IOleControl
, riid
)) {
2580 TRACE("(%p)->(IID_IOleControl %p)\n", This
, ppv
);
2581 *ppv
= &This
->IOleControl_iface
;
2582 }else if(IsEqualGUID(&IID_IQuickActivate
, riid
)) {
2583 TRACE("(%p)->(IID_IQuickActivate %p)\n", This
, ppv
);
2584 *ppv
= &This
->IQuickActivate_iface
;
2585 }else if(IsEqualGUID(&IID_IViewObject
, riid
)) {
2586 TRACE("(%p)->(IID_IViewObject %p)\n", This
, ppv
);
2587 *ppv
= &This
->IViewObjectEx_iface
;
2588 }else if(IsEqualGUID(&IID_IViewObject2
, riid
)) {
2589 TRACE("(%p)->(IID_IViewObject2 %p)\n", This
, ppv
);
2590 *ppv
= &This
->IViewObjectEx_iface
;
2591 }else if(IsEqualGUID(&IID_IViewObjectEx
, riid
)) {
2592 TRACE("(%p)->(IID_IViewObjectEx %p)\n", This
, ppv
);
2593 *ppv
= &This
->IViewObjectEx_iface
;
2594 }else if(IsEqualGUID(&IID_IPointerInactive
, riid
)) {
2595 TRACE("(%p)->(IID_IPointerInactive %p)\n", This
, ppv
);
2596 *ppv
= &This
->IPointerInactive_iface
;
2597 }else if(IsEqualGUID(&IID_IConnectionPointContainer
, riid
)) {
2598 TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This
, ppv
);
2599 *ppv
= &This
->IConnectionPointContainer_iface
;
2601 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
2603 return E_NOINTERFACE
;
2606 IUnknown_AddRef((IUnknown
*)*ppv
);
2610 static ULONG WINAPI
ScriptControl_AddRef(IScriptControl
*iface
)
2612 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2613 LONG ref
= InterlockedIncrement(&This
->ref
);
2615 TRACE("(%p) ref=%d\n", This
, ref
);
2620 static ULONG WINAPI
ScriptControl_Release(IScriptControl
*iface
)
2622 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2623 LONG ref
= InterlockedDecrement(&This
->ref
);
2625 TRACE("(%p) ref=%d\n", This
, ref
);
2629 IOleClientSite_Release(This
->site
);
2632 release_modules(This
, FALSE
);
2633 IActiveScriptSite_Release(&This
->host
->IActiveScriptSite_iface
);
2635 IScriptError_Release(&This
->error
->IScriptError_iface
);
2642 static HRESULT WINAPI
ScriptControl_GetTypeInfoCount(IScriptControl
*iface
, UINT
*pctinfo
)
2644 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2645 TRACE("(%p)->(%p)\n", This
, pctinfo
);
2650 static HRESULT WINAPI
ScriptControl_GetTypeInfo(IScriptControl
*iface
, UINT iTInfo
,
2651 LCID lcid
, ITypeInfo
**ppTInfo
)
2653 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2654 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
2655 return get_typeinfo(IScriptControl_tid
, ppTInfo
);
2658 static HRESULT WINAPI
ScriptControl_GetIDsOfNames(IScriptControl
*iface
, REFIID riid
,
2659 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2661 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2662 ITypeInfo
*typeinfo
;
2665 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
2667 hres
= get_typeinfo(IScriptControl_tid
, &typeinfo
);
2668 if(SUCCEEDED(hres
)) {
2669 hres
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
2670 ITypeInfo_Release(typeinfo
);
2676 static HRESULT WINAPI
ScriptControl_Invoke(IScriptControl
*iface
, DISPID dispIdMember
,
2677 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
2678 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2680 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2681 ITypeInfo
*typeinfo
;
2684 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
2685 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2687 hres
= get_typeinfo(IScriptControl_tid
, &typeinfo
);
2688 if(SUCCEEDED(hres
)) {
2689 hres
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
2690 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2691 ITypeInfo_Release(typeinfo
);
2697 static HRESULT WINAPI
ScriptControl_get_Language(IScriptControl
*iface
, BSTR
*p
)
2699 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2703 TRACE("(%p)->(%p)\n", This
, p
);
2713 hr
= ProgIDFromCLSID(&This
->host
->clsid
, &progidW
);
2717 *p
= SysAllocString(progidW
);
2718 CoTaskMemFree(progidW
);
2719 return *p
? S_OK
: E_OUTOFMEMORY
;
2722 static HRESULT WINAPI
ScriptControl_put_Language(IScriptControl
*iface
, BSTR language
)
2724 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2728 TRACE("(%p)->(%s)\n", This
, debugstr_w(language
));
2730 if (language
&& FAILED(CLSIDFromProgID(language
, &clsid
)))
2731 return CTL_E_INVALIDPROPERTYVALUE
;
2734 release_modules(This
, TRUE
);
2735 IActiveScriptSite_Release(&This
->host
->IActiveScriptSite_iface
);
2742 hres
= init_script_host(This
, &clsid
, &This
->host
);
2746 /* Alloc global module */
2747 This
->modules
= heap_alloc_zero(sizeof(*This
->modules
));
2748 if (This
->modules
) {
2749 This
->modules
[0] = create_module(This
->host
, NULL
);
2750 if (!This
->modules
[0]) {
2751 heap_free(This
->modules
);
2752 This
->modules
= NULL
;
2753 hres
= E_OUTOFMEMORY
;
2757 hres
= E_OUTOFMEMORY
;
2760 detach_script_host(This
->host
);
2766 static HRESULT WINAPI
ScriptControl_get_State(IScriptControl
*iface
, ScriptControlStates
*p
)
2768 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2772 TRACE("(%p)->(%p)\n", This
, p
);
2780 hres
= IActiveScript_GetScriptState(This
->host
->script
, &state
);
2781 if (FAILED(hres
)) return hres
;
2785 case SCRIPTSTATE_INITIALIZED
:
2786 case SCRIPTSTATE_STARTED
:
2789 case SCRIPTSTATE_CONNECTED
:
2793 WARN("unexpected state %d\n", state
);
2799 static HRESULT WINAPI
ScriptControl_put_State(IScriptControl
*iface
, ScriptControlStates state
)
2801 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2802 TRACE("(%p)->(%x)\n", This
, state
);
2807 if(state
!= Initialized
&& state
!= Connected
)
2808 return CTL_E_INVALIDPROPERTYVALUE
;
2810 return IActiveScript_SetScriptState(This
->host
->script
, state
== Connected
? SCRIPTSTATE_CONNECTED
: SCRIPTSTATE_STARTED
);
2813 static HRESULT WINAPI
ScriptControl_put_SitehWnd(IScriptControl
*iface
, LONG hwnd
)
2815 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2817 TRACE("(%p)->(%x)\n", This
, hwnd
);
2819 if (hwnd
&& !IsWindow(LongToHandle(hwnd
)))
2820 return CTL_E_INVALIDPROPERTYVALUE
;
2822 This
->site_hwnd
= LongToHandle(hwnd
);
2824 This
->host
->site_hwnd
= This
->allow_ui
? This
->site_hwnd
: ((HWND
)-1);
2828 static HRESULT WINAPI
ScriptControl_get_SitehWnd(IScriptControl
*iface
, LONG
*p
)
2830 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2832 TRACE("(%p)->(%p)\n", This
, p
);
2834 if (!p
) return E_POINTER
;
2836 *p
= HandleToLong(This
->site_hwnd
);
2840 static HRESULT WINAPI
ScriptControl_get_Timeout(IScriptControl
*iface
, LONG
*p
)
2842 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2844 TRACE("(%p)->(%p)\n", This
, p
);
2853 static HRESULT WINAPI
ScriptControl_put_Timeout(IScriptControl
*iface
, LONG timeout
)
2855 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2857 TRACE("(%p)->(%d)\n", This
, timeout
);
2860 return CTL_E_INVALIDPROPERTYVALUE
;
2863 FIXME("execution timeout ignored\n");
2865 This
->timeout
= timeout
;
2869 static HRESULT WINAPI
ScriptControl_get_AllowUI(IScriptControl
*iface
, VARIANT_BOOL
*p
)
2871 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2872 TRACE("(%p)->(%p)\n", This
, p
);
2877 *p
= This
->allow_ui
;
2881 static HRESULT WINAPI
ScriptControl_put_AllowUI(IScriptControl
*iface
, VARIANT_BOOL allow_ui
)
2883 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2884 TRACE("(%p)->(%x)\n", This
, allow_ui
);
2886 This
->allow_ui
= allow_ui
;
2888 This
->host
->site_hwnd
= allow_ui
? This
->site_hwnd
: ((HWND
)-1);
2892 static HRESULT WINAPI
ScriptControl_get_UseSafeSubset(IScriptControl
*iface
, VARIANT_BOOL
*p
)
2894 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2895 TRACE("(%p)->(%p)\n", This
, p
);
2900 *p
= This
->use_safe_subset
;
2904 static HRESULT WINAPI
ScriptControl_put_UseSafeSubset(IScriptControl
*iface
, VARIANT_BOOL use_safe_subset
)
2906 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2907 TRACE("(%p)->(%x)\n", This
, use_safe_subset
);
2909 if (This
->host
&& This
->use_safe_subset
!= use_safe_subset
)
2910 set_safety_opts(This
->host
->script
, use_safe_subset
);
2912 This
->use_safe_subset
= use_safe_subset
;
2916 static HRESULT WINAPI
ScriptControl_get_Modules(IScriptControl
*iface
, IScriptModuleCollection
**p
)
2918 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2920 TRACE("(%p)->(%p)\n", This
, p
);
2922 if (!This
->host
) return E_FAIL
;
2924 *p
= &This
->IScriptModuleCollection_iface
;
2925 IScriptControl_AddRef(iface
);
2929 static HRESULT WINAPI
ScriptControl_get_Error(IScriptControl
*iface
, IScriptError
**p
)
2931 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2933 TRACE("(%p)->(%p)\n", This
, p
);
2935 if (!p
) return E_POINTER
;
2937 *p
= &This
->error
->IScriptError_iface
;
2938 IScriptError_AddRef(*p
);
2942 static HRESULT WINAPI
ScriptControl_get_CodeObject(IScriptControl
*iface
, IDispatch
**p
)
2944 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2946 TRACE("(%p)->(%p)\n", This
, p
);
2948 if (!This
->host
) return E_FAIL
;
2950 return IScriptModule_get_CodeObject(&This
->modules
[0]->IScriptModule_iface
, p
);
2953 static HRESULT WINAPI
ScriptControl_get_Procedures(IScriptControl
*iface
, IScriptProcedureCollection
**p
)
2955 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2957 TRACE("(%p)->(%p)\n", This
, p
);
2959 if (!This
->host
) return E_FAIL
;
2961 return IScriptModule_get_Procedures(&This
->modules
[0]->IScriptModule_iface
, p
);
2964 static HRESULT WINAPI
ScriptControl__AboutBox(IScriptControl
*iface
)
2966 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2967 FIXME("(%p)\n", This
);
2971 static HRESULT WINAPI
ScriptControl_AddObject(IScriptControl
*iface
, BSTR name
, IDispatch
*object
, VARIANT_BOOL add_members
)
2973 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2974 DWORD flags
= SCRIPTITEM_ISVISIBLE
| SCRIPTITEM_ISSOURCE
;
2976 TRACE("(%p)->(%s %p %x)\n", This
, debugstr_w(name
), object
, add_members
);
2979 return E_INVALIDARG
;
2985 flags
|= SCRIPTITEM_GLOBALMEMBERS
;
2986 return add_script_object(This
->host
, name
, object
, flags
);
2989 static HRESULT WINAPI
ScriptControl_Reset(IScriptControl
*iface
)
2991 ScriptControl
*This
= impl_from_IScriptControl(iface
);
2993 TRACE("(%p)\n", This
);
2998 clear_named_items(This
->host
);
2999 return set_script_state(This
->host
, SCRIPTSTATE_INITIALIZED
);
3002 static HRESULT WINAPI
ScriptControl_AddCode(IScriptControl
*iface
, BSTR code
)
3004 ScriptControl
*This
= impl_from_IScriptControl(iface
);
3006 TRACE("(%p)->(%s).\n", This
, debugstr_w(code
));
3011 return parse_script_text(This
->modules
[0], code
, SCRIPTTEXT_ISVISIBLE
, NULL
);
3014 static HRESULT WINAPI
ScriptControl_Eval(IScriptControl
*iface
, BSTR expression
, VARIANT
*res
)
3016 ScriptControl
*This
= impl_from_IScriptControl(iface
);
3018 TRACE("(%p)->(%s, %p).\n", This
, debugstr_w(expression
), res
);
3022 V_VT(res
) = VT_EMPTY
;
3026 return parse_script_text(This
->modules
[0], expression
, SCRIPTTEXT_ISEXPRESSION
, res
);
3029 static HRESULT WINAPI
ScriptControl_ExecuteStatement(IScriptControl
*iface
, BSTR statement
)
3031 ScriptControl
*This
= impl_from_IScriptControl(iface
);
3033 TRACE("(%p)->(%s)\n", This
, debugstr_w(statement
));
3038 return parse_script_text(This
->modules
[0], statement
, 0, NULL
);
3041 static HRESULT WINAPI
ScriptControl_Run(IScriptControl
*iface
, BSTR procedure_name
, SAFEARRAY
**parameters
, VARIANT
*res
)
3043 ScriptControl
*This
= impl_from_IScriptControl(iface
);
3046 TRACE("(%p)->(%s %p %p)\n", This
, debugstr_w(procedure_name
), parameters
, res
);
3048 if (!parameters
|| !res
) return E_POINTER
;
3049 if (!(sa
= *parameters
)) return E_POINTER
;
3051 V_VT(res
) = VT_EMPTY
;
3052 if (sa
->cDims
== 0) return DISP_E_BADINDEX
;
3053 if (!(sa
->fFeatures
& FADF_VARIANT
)) return DISP_E_BADVARTYPE
;
3054 if (!This
->host
) return E_FAIL
;
3056 return run_procedure(This
->modules
[0], procedure_name
, sa
, res
);
3059 static const IScriptControlVtbl ScriptControlVtbl
= {
3060 ScriptControl_QueryInterface
,
3061 ScriptControl_AddRef
,
3062 ScriptControl_Release
,
3063 ScriptControl_GetTypeInfoCount
,
3064 ScriptControl_GetTypeInfo
,
3065 ScriptControl_GetIDsOfNames
,
3066 ScriptControl_Invoke
,
3067 ScriptControl_get_Language
,
3068 ScriptControl_put_Language
,
3069 ScriptControl_get_State
,
3070 ScriptControl_put_State
,
3071 ScriptControl_put_SitehWnd
,
3072 ScriptControl_get_SitehWnd
,
3073 ScriptControl_get_Timeout
,
3074 ScriptControl_put_Timeout
,
3075 ScriptControl_get_AllowUI
,
3076 ScriptControl_put_AllowUI
,
3077 ScriptControl_get_UseSafeSubset
,
3078 ScriptControl_put_UseSafeSubset
,
3079 ScriptControl_get_Modules
,
3080 ScriptControl_get_Error
,
3081 ScriptControl_get_CodeObject
,
3082 ScriptControl_get_Procedures
,
3083 ScriptControl__AboutBox
,
3084 ScriptControl_AddObject
,
3085 ScriptControl_Reset
,
3086 ScriptControl_AddCode
,
3088 ScriptControl_ExecuteStatement
,
3092 static HRESULT WINAPI
OleObject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **obj
)
3094 ScriptControl
*This
= impl_from_IOleObject(iface
);
3095 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
3098 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
3100 ScriptControl
*This
= impl_from_IOleObject(iface
);
3101 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
3104 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
3106 ScriptControl
*This
= impl_from_IOleObject(iface
);
3107 return IScriptControl_Release(&This
->IScriptControl_iface
);
3110 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, IOleClientSite
*site
)
3112 ScriptControl
*This
= impl_from_IOleObject(iface
);
3114 TRACE("(%p)->(%p)\n", This
, site
);
3117 IOleClientSite_Release(This
->site
);
3119 if ((This
->site
= site
))
3120 IOleClientSite_AddRef(site
);
3125 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, IOleClientSite
**site
)
3127 ScriptControl
*This
= impl_from_IOleObject(iface
);
3129 TRACE("(%p)->(%p)\n", This
, site
);
3134 if ((*site
= This
->site
))
3135 IOleClientSite_AddRef(*site
);
3140 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR containerapp
, LPCOLESTR containerobj
)
3142 ScriptControl
*This
= impl_from_IOleObject(iface
);
3144 FIXME("(%p)->(%s %s)\n", This
, debugstr_w(containerapp
), debugstr_w(containerobj
));
3149 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD save
)
3151 ScriptControl
*This
= impl_from_IOleObject(iface
);
3153 FIXME("(%p)->(%d)\n", This
, save
);
3158 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD which
, IMoniker
*moniker
)
3160 ScriptControl
*This
= impl_from_IOleObject(iface
);
3162 FIXME("(%p)->(%d %p)\n", This
, which
, moniker
);
3167 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD assign
, DWORD which
, IMoniker
**moniker
)
3169 ScriptControl
*This
= impl_from_IOleObject(iface
);
3171 FIXME("(%p)->(%d %d %p)\n", This
, assign
, which
, moniker
);
3176 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, IDataObject
*dataobj
, BOOL creation
,
3179 ScriptControl
*This
= impl_from_IOleObject(iface
);
3181 FIXME("(%p)->(%p %d %d)\n", This
, dataobj
, creation
, reserved
);
3186 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD reserved
, IDataObject
**dataobj
)
3188 ScriptControl
*This
= impl_from_IOleObject(iface
);
3190 FIXME("(%p)->(%d %p)\n", This
, reserved
, dataobj
);
3195 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG verb
, LPMSG msg
, IOleClientSite
*active_site
,
3196 LONG index
, HWND hwndParent
, LPCRECT rect
)
3198 ScriptControl
*This
= impl_from_IOleObject(iface
);
3200 FIXME("(%p)->(%d %p %p %d %p %p)\n", This
, verb
, msg
, active_site
, index
, hwndParent
, rect
);
3205 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**enumoleverb
)
3207 ScriptControl
*This
= impl_from_IOleObject(iface
);
3209 FIXME("(%p)->(%p)\n", This
, enumoleverb
);
3214 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
3216 ScriptControl
*This
= impl_from_IOleObject(iface
);
3218 FIXME("(%p)\n", This
);
3223 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
3225 ScriptControl
*This
= impl_from_IOleObject(iface
);
3227 FIXME("(%p)\n", This
);
3232 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
*clsid
)
3234 ScriptControl
*This
= impl_from_IOleObject(iface
);
3236 FIXME("(%p)->(%p)\n", This
, clsid
);
3241 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD form_of_type
, LPOLESTR
*usertype
)
3243 ScriptControl
*This
= impl_from_IOleObject(iface
);
3245 FIXME("(%p)->(%d %p)\n", This
, form_of_type
, usertype
);
3250 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD aspect
, SIZEL
*size
)
3252 ScriptControl
*This
= impl_from_IOleObject(iface
);
3254 FIXME("(%p)->(%d %p)\n", This
, aspect
, size
);
3259 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD aspect
, SIZEL
*size
)
3261 ScriptControl
*This
= impl_from_IOleObject(iface
);
3263 TRACE("(%p)->(%d %p)\n", This
, aspect
, size
);
3265 if (aspect
!= DVASPECT_CONTENT
)
3266 return DV_E_DVASPECT
;
3268 *size
= This
->extent
;
3272 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*sink
, DWORD
*connection
)
3274 ScriptControl
*This
= impl_from_IOleObject(iface
);
3276 FIXME("(%p)->(%p %p)\n", This
, sink
, connection
);
3281 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD connection
)
3283 ScriptControl
*This
= impl_from_IOleObject(iface
);
3285 FIXME("(%p)->(%d)\n", This
, connection
);
3290 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**enumadvise
)
3292 ScriptControl
*This
= impl_from_IOleObject(iface
);
3294 FIXME("(%p)->(%p)\n", This
, enumadvise
);
3299 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD aspect
, DWORD
*status
)
3301 ScriptControl
*This
= impl_from_IOleObject(iface
);
3303 TRACE("(%p)->(%d %p)\n", This
, aspect
, status
);
3305 return OleRegGetMiscStatus(&CLSID_ScriptControl
, aspect
, status
);
3308 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
*logpal
)
3310 ScriptControl
*This
= impl_from_IOleObject(iface
);
3312 FIXME("(%p)->(%p)\n", This
, logpal
);
3317 static const IOleObjectVtbl OleObjectVtbl
= {
3318 OleObject_QueryInterface
,
3321 OleObject_SetClientSite
,
3322 OleObject_GetClientSite
,
3323 OleObject_SetHostNames
,
3325 OleObject_SetMoniker
,
3326 OleObject_GetMoniker
,
3327 OleObject_InitFromData
,
3328 OleObject_GetClipboardData
,
3330 OleObject_EnumVerbs
,
3332 OleObject_IsUpToDate
,
3333 OleObject_GetUserClassID
,
3334 OleObject_GetUserType
,
3335 OleObject_SetExtent
,
3336 OleObject_GetExtent
,
3339 OleObject_EnumAdvise
,
3340 OleObject_GetMiscStatus
,
3341 OleObject_SetColorScheme
3344 static HRESULT WINAPI
PersistStreamInit_QueryInterface(IPersistStreamInit
*iface
, REFIID riid
, void **obj
)
3346 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3347 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
3350 static ULONG WINAPI
PersistStreamInit_AddRef(IPersistStreamInit
*iface
)
3352 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3353 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
3356 static ULONG WINAPI
PersistStreamInit_Release(IPersistStreamInit
*iface
)
3358 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3359 return IScriptControl_Release(&This
->IScriptControl_iface
);
3362 static HRESULT WINAPI
PersistStreamInit_GetClassID(IPersistStreamInit
*iface
, CLSID
*clsid
)
3364 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3366 FIXME("(%p)->(%p)\n", This
, clsid
);
3371 static HRESULT WINAPI
PersistStreamInit_IsDirty(IPersistStreamInit
*iface
)
3373 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3375 FIXME("(%p)\n", This
);
3380 static HRESULT WINAPI
PersistStreamInit_Load(IPersistStreamInit
*iface
, IStream
*stream
)
3382 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3384 FIXME("(%p)->(%p)\n", This
, stream
);
3389 static HRESULT WINAPI
PersistStreamInit_Save(IPersistStreamInit
*iface
, IStream
*stream
, BOOL clear_dirty
)
3391 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3393 FIXME("(%p)->(%p %d)\n", This
, stream
, clear_dirty
);
3398 static HRESULT WINAPI
PersistStreamInit_GetSizeMax(IPersistStreamInit
*iface
, ULARGE_INTEGER
*size
)
3400 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3402 FIXME("(%p)->(%p)\n", This
, size
);
3407 static HRESULT WINAPI
PersistStreamInit_InitNew(IPersistStreamInit
*iface
)
3409 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
3411 FIXME("(%p)\n", This
);
3416 static const IPersistStreamInitVtbl PersistStreamInitVtbl
= {
3417 PersistStreamInit_QueryInterface
,
3418 PersistStreamInit_AddRef
,
3419 PersistStreamInit_Release
,
3420 PersistStreamInit_GetClassID
,
3421 PersistStreamInit_IsDirty
,
3422 PersistStreamInit_Load
,
3423 PersistStreamInit_Save
,
3424 PersistStreamInit_GetSizeMax
,
3425 PersistStreamInit_InitNew
3428 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
, REFIID riid
, void **obj
)
3430 ScriptControl
*This
= impl_from_IOleControl(iface
);
3431 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
3434 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
3436 ScriptControl
*This
= impl_from_IOleControl(iface
);
3437 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
3440 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
3442 ScriptControl
*This
= impl_from_IOleControl(iface
);
3443 return IScriptControl_Release(&This
->IScriptControl_iface
);
3446 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, CONTROLINFO
*info
)
3448 ScriptControl
*This
= impl_from_IOleControl(iface
);
3450 TRACE("(%p)->(%p)\n", This
, info
);
3455 info
->hAccel
= NULL
;
3461 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, MSG
*msg
)
3463 ScriptControl
*This
= impl_from_IOleControl(iface
);
3465 FIXME("(%p)->(%p)\n", This
, msg
);
3470 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispid
)
3472 ScriptControl
*This
= impl_from_IOleControl(iface
);
3474 FIXME("(%p)->(%#x)\n", This
, dispid
);
3479 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL freeze
)
3481 ScriptControl
*This
= impl_from_IOleControl(iface
);
3483 FIXME("(%p)->(%d)\n", This
, freeze
);
3488 static const IOleControlVtbl OleControlVtbl
= {
3489 OleControl_QueryInterface
,
3492 OleControl_GetControlInfo
,
3493 OleControl_OnMnemonic
,
3494 OleControl_OnAmbientPropertyChange
,
3495 OleControl_FreezeEvents
3498 static HRESULT WINAPI
QuickActivate_QueryInterface(IQuickActivate
*iface
, REFIID riid
, void **obj
)
3500 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
3501 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
3504 static ULONG WINAPI
QuickActivate_AddRef(IQuickActivate
*iface
)
3506 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
3507 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
3510 static ULONG WINAPI
QuickActivate_Release(IQuickActivate
*iface
)
3512 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
3513 return IScriptControl_Release(&This
->IScriptControl_iface
);
3516 static HRESULT WINAPI
QuickActivate_QuickActivate(IQuickActivate
*iface
, QACONTAINER
*container
, QACONTROL
*control
)
3518 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
3520 FIXME("(%p)->(%p %p)\n", This
, container
, control
);
3525 static HRESULT WINAPI
QuickActivate_SetContentExtent(IQuickActivate
*iface
, SIZEL
*size
)
3527 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
3529 FIXME("(%p)->(%p)\n", This
, size
);
3534 static HRESULT WINAPI
QuickActivate_GetContentExtent(IQuickActivate
*iface
, SIZEL
*size
)
3536 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
3538 FIXME("(%p)->(%p)\n", This
, size
);
3543 static const IQuickActivateVtbl QuickActivateVtbl
= {
3544 QuickActivate_QueryInterface
,
3545 QuickActivate_AddRef
,
3546 QuickActivate_Release
,
3547 QuickActivate_QuickActivate
,
3548 QuickActivate_SetContentExtent
,
3549 QuickActivate_GetContentExtent
3552 static HRESULT WINAPI
ViewObject_QueryInterface(IViewObjectEx
*iface
, REFIID riid
, void **obj
)
3554 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3555 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
3558 static ULONG WINAPI
ViewObject_AddRef(IViewObjectEx
*iface
)
3560 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3561 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
3564 static ULONG WINAPI
ViewObject_Release(IViewObjectEx
*iface
)
3566 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3567 return IScriptControl_Release(&This
->IScriptControl_iface
);
3570 static HRESULT WINAPI
ViewObject_Draw(IViewObjectEx
*iface
, DWORD drawaspect
, LONG index
, void *aspect
,
3571 DVTARGETDEVICE
*device
, HDC target_dev
, HDC hdc_draw
, const RECTL
*bounds
, const RECTL
*win_bounds
,
3572 BOOL (STDMETHODCALLTYPE
*fn_continue
)(ULONG_PTR cont
), ULONG_PTR cont
)
3574 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3576 FIXME("(%p)->(%d %d %p %p %p %p %p %p %p %lu)\n", This
, drawaspect
, index
, aspect
, device
, target_dev
,
3577 hdc_draw
, bounds
, win_bounds
, fn_continue
, cont
);
3582 static HRESULT WINAPI
ViewObject_GetColorSet(IViewObjectEx
*iface
, DWORD drawaspect
, LONG index
, void *aspect
,
3583 DVTARGETDEVICE
*device
, HDC hic_target
, LOGPALETTE
**colorset
)
3585 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3587 FIXME("(%p)->(%d %d %p %p %p %p)\n", This
, drawaspect
, index
, aspect
, device
, hic_target
,
3593 static HRESULT WINAPI
ViewObject_Freeze(IViewObjectEx
*iface
, DWORD drawaspect
, LONG index
, void *aspect
,
3596 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3598 FIXME("(%p)->(%d %d %p %p)\n", This
, drawaspect
, index
, aspect
, freeze
);
3603 static HRESULT WINAPI
ViewObject_Unfreeze(IViewObjectEx
*iface
, DWORD freeze
)
3605 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3607 FIXME("(%p)->(%d)\n", This
, freeze
);
3612 static HRESULT WINAPI
ViewObject_SetAdvise(IViewObjectEx
*iface
, DWORD aspects
, DWORD flags
, IAdviseSink
*sink
)
3614 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3616 TRACE("(%p)->(%d %#x %p)\n", This
, aspects
, flags
, sink
);
3618 if (aspects
!= DVASPECT_CONTENT
)
3619 return DV_E_DVASPECT
;
3621 This
->view_sink_flags
= flags
;
3622 if (This
->view_sink
)
3623 IAdviseSink_Release(This
->view_sink
);
3624 This
->view_sink
= sink
;
3625 if (This
->view_sink
)
3626 IAdviseSink_AddRef(This
->view_sink
);
3631 static HRESULT WINAPI
ViewObject_GetAdvise(IViewObjectEx
*iface
, DWORD
*aspects
, DWORD
*flags
, IAdviseSink
**sink
)
3633 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3635 TRACE("(%p)->(%p %p %p)\n", This
, aspects
, flags
, sink
);
3638 *aspects
= DVASPECT_CONTENT
;
3640 *flags
= This
->view_sink_flags
;
3642 *sink
= This
->view_sink
;
3644 IAdviseSink_AddRef(*sink
);
3650 static HRESULT WINAPI
ViewObject_GetExtent(IViewObjectEx
*iface
, DWORD draw_aspect
, LONG index
,
3651 DVTARGETDEVICE
*device
, SIZEL
*size
)
3653 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3655 FIXME("(%p)->(%d %d %p %p)\n", This
, draw_aspect
, index
, device
, size
);
3660 static HRESULT WINAPI
ViewObject_GetRect(IViewObjectEx
*iface
, DWORD aspect
, RECTL
*rect
)
3662 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3664 FIXME("(%p)->(%d %p)\n", This
, aspect
, rect
);
3669 static HRESULT WINAPI
ViewObject_GetViewStatus(IViewObjectEx
*iface
, DWORD
*status
)
3671 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3673 TRACE("(%p)->(%p)\n", This
, status
);
3675 *status
= VIEWSTATUS_OPAQUE
;
3679 static HRESULT WINAPI
ViewObject_QueryHitPoint(IViewObjectEx
*iface
, DWORD aspect
, const RECT
*bounds
,
3680 POINT pt
, LONG close_hint
, DWORD
*hit_result
)
3682 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3684 FIXME("(%p)->(%d %s %s %d %p)\n", This
, aspect
, wine_dbgstr_rect(bounds
), wine_dbgstr_point(&pt
), close_hint
, hit_result
);
3689 static HRESULT WINAPI
ViewObject_QueryHitRect(IViewObjectEx
*iface
, DWORD aspect
, const RECT
*bounds
,
3690 const RECT
*loc
, LONG close_hint
, DWORD
*hit_result
)
3692 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3694 FIXME("(%p)->(%d %s %s %d %p)\n", This
, aspect
, wine_dbgstr_rect(bounds
), wine_dbgstr_rect(loc
), close_hint
, hit_result
);
3699 static HRESULT WINAPI
ViewObject_GetNaturalExtent(IViewObjectEx
*iface
, DWORD aspect
, LONG index
,
3700 DVTARGETDEVICE
*device
, HDC target_hdc
, DVEXTENTINFO
*extent_info
, SIZEL
*size
)
3702 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
3704 FIXME("(%p)->(%d %d %p %p %p %p)\n", This
, aspect
, index
, device
, target_hdc
, extent_info
, size
);
3709 static const IViewObjectExVtbl ViewObjectExVtbl
= {
3710 ViewObject_QueryInterface
,
3714 ViewObject_GetColorSet
,
3716 ViewObject_Unfreeze
,
3717 ViewObject_SetAdvise
,
3718 ViewObject_GetAdvise
,
3719 ViewObject_GetExtent
,
3721 ViewObject_GetViewStatus
,
3722 ViewObject_QueryHitPoint
,
3723 ViewObject_QueryHitRect
,
3724 ViewObject_GetNaturalExtent
3727 static HRESULT WINAPI
PointerInactive_QueryInterface(IPointerInactive
*iface
, REFIID riid
, void **obj
)
3729 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
3730 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
3733 static ULONG WINAPI
PointerInactive_AddRef(IPointerInactive
*iface
)
3735 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
3736 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
3739 static ULONG WINAPI
PointerInactive_Release(IPointerInactive
*iface
)
3741 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
3742 return IScriptControl_Release(&This
->IScriptControl_iface
);
3745 static HRESULT WINAPI
PointerInactive_GetActivationPolicy(IPointerInactive
*iface
, DWORD
*policy
)
3747 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
3749 TRACE("(%p)->(%p)\n", This
, policy
);
3758 static HRESULT WINAPI
PointerInactive_OnInactiveMouseMove(IPointerInactive
*iface
, const RECT
*bounds
,
3759 LONG x
, LONG y
, DWORD key_state
)
3761 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
3763 FIXME("(%p)->(%s %d %d %#x)\n", This
, wine_dbgstr_rect(bounds
), x
, y
, key_state
);
3768 static HRESULT WINAPI
PointerInactive_OnInactiveSetCursor(IPointerInactive
*iface
, const RECT
*bounds
,
3769 LONG x
, LONG y
, DWORD msg
, BOOL set_always
)
3771 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
3773 FIXME("(%p)->(%s %d %d %#x %d)\n", This
, wine_dbgstr_rect(bounds
), x
, y
, msg
, set_always
);
3778 static const IPointerInactiveVtbl PointerInactiveVtbl
= {
3779 PointerInactive_QueryInterface
,
3780 PointerInactive_AddRef
,
3781 PointerInactive_Release
,
3782 PointerInactive_GetActivationPolicy
,
3783 PointerInactive_OnInactiveMouseMove
,
3784 PointerInactive_OnInactiveSetCursor
3787 static HRESULT WINAPI
ConnectionPointContainer_QueryInterface(IConnectionPointContainer
*iface
, REFIID riid
, void **obj
)
3789 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
3790 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
3793 static ULONG WINAPI
ConnectionPointContainer_AddRef(IConnectionPointContainer
*iface
)
3795 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
3796 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
3799 static ULONG WINAPI
ConnectionPointContainer_Release(IConnectionPointContainer
*iface
)
3801 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
3802 return IScriptControl_Release(&This
->IScriptControl_iface
);
3805 static HRESULT WINAPI
ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer
*iface
, IEnumConnectionPoints
**enum_points
)
3807 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
3809 FIXME("(%p)->(%p)\n", This
, enum_points
);
3814 static HRESULT WINAPI
ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer
*iface
, REFIID riid
, IConnectionPoint
**cp
)
3816 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
3817 ConnectionPoint
*iter
;
3819 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), cp
);
3823 for (iter
= This
->cp_list
; iter
; iter
= iter
->next
) {
3824 if (IsEqualIID(iter
->riid
, riid
))
3825 *cp
= &iter
->IConnectionPoint_iface
;
3829 IConnectionPoint_AddRef(*cp
);
3833 FIXME("unsupported connection point %s\n", debugstr_guid(riid
));
3834 return CONNECT_E_NOCONNECTION
;
3837 static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl
= {
3838 ConnectionPointContainer_QueryInterface
,
3839 ConnectionPointContainer_AddRef
,
3840 ConnectionPointContainer_Release
,
3841 ConnectionPointContainer_EnumConnectionPoints
,
3842 ConnectionPointContainer_FindConnectionPoint
3845 static HRESULT WINAPI
ConnectionPoint_QueryInterface(IConnectionPoint
*iface
,
3846 REFIID riid
, void **ppv
)
3848 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
3850 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
3851 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
3852 *ppv
= &This
->IConnectionPoint_iface
;
3853 }else if(IsEqualGUID(&IID_IConnectionPoint
, riid
)) {
3854 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
3855 *ppv
= &This
->IConnectionPoint_iface
;
3857 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
3859 return E_NOINTERFACE
;
3862 IUnknown_AddRef((IUnknown
*)*ppv
);
3866 static ULONG WINAPI
ConnectionPoint_AddRef(IConnectionPoint
*iface
)
3868 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
3869 return IConnectionPointContainer_AddRef(&This
->control
->IConnectionPointContainer_iface
);
3872 static ULONG WINAPI
ConnectionPoint_Release(IConnectionPoint
*iface
)
3874 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
3875 return IConnectionPointContainer_Release(&This
->control
->IConnectionPointContainer_iface
);
3878 static HRESULT WINAPI
ConnectionPoint_GetConnectionInterface(IConnectionPoint
*iface
, IID
*iid
)
3880 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
3882 TRACE("(%p)->(%p)\n", This
, iid
);
3888 static HRESULT WINAPI
ConnectionPoint_GetConnectionPointContainer(IConnectionPoint
*iface
,
3889 IConnectionPointContainer
**container
)
3891 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
3893 TRACE("(%p)->(%p)\n", This
, container
);
3898 *container
= &This
->control
->IConnectionPointContainer_iface
;
3899 IConnectionPointContainer_AddRef(*container
);
3904 static HRESULT WINAPI
ConnectionPoint_Advise(IConnectionPoint
*iface
, IUnknown
*unk_sink
,
3907 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
3909 FIXME("(%p)->(%p %p)\n", This
, unk_sink
, cookie
);
3914 static HRESULT WINAPI
ConnectionPoint_Unadvise(IConnectionPoint
*iface
, DWORD cookie
)
3916 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
3918 FIXME("(%p)->(%d)\n", This
, cookie
);
3923 static HRESULT WINAPI
ConnectionPoint_EnumConnections(IConnectionPoint
*iface
,
3924 IEnumConnections
**ppEnum
)
3926 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
3928 FIXME("(%p)->(%p): stub\n", This
, ppEnum
);
3933 static const IConnectionPointVtbl ConnectionPointVtbl
=
3935 ConnectionPoint_QueryInterface
,
3936 ConnectionPoint_AddRef
,
3937 ConnectionPoint_Release
,
3938 ConnectionPoint_GetConnectionInterface
,
3939 ConnectionPoint_GetConnectionPointContainer
,
3940 ConnectionPoint_Advise
,
3941 ConnectionPoint_Unadvise
,
3942 ConnectionPoint_EnumConnections
3945 static void ConnectionPoint_Init(ConnectionPoint
*cp
, ScriptControl
*sc
, REFIID riid
)
3947 cp
->IConnectionPoint_iface
.lpVtbl
= &ConnectionPointVtbl
;
3951 cp
->next
= sc
->cp_list
;
3955 static HRESULT WINAPI
ScriptControl_CreateInstance(IClassFactory
*iface
, IUnknown
*outer
, REFIID riid
, void **ppv
)
3957 ScriptControl
*script_control
;
3962 TRACE("(%p %s %p)\n", outer
, debugstr_guid(riid
), ppv
);
3964 script_control
= heap_alloc_zero(sizeof(*script_control
));
3966 return E_OUTOFMEMORY
;
3968 script_control
->error
= heap_alloc_zero(sizeof(*script_control
->error
));
3969 if(!script_control
->error
)
3971 heap_free(script_control
);
3972 return E_OUTOFMEMORY
;
3975 script_control
->IScriptControl_iface
.lpVtbl
= &ScriptControlVtbl
;
3976 script_control
->IPersistStreamInit_iface
.lpVtbl
= &PersistStreamInitVtbl
;
3977 script_control
->IOleObject_iface
.lpVtbl
= &OleObjectVtbl
;
3978 script_control
->IOleControl_iface
.lpVtbl
= &OleControlVtbl
;
3979 script_control
->IQuickActivate_iface
.lpVtbl
= &QuickActivateVtbl
;
3980 script_control
->IViewObjectEx_iface
.lpVtbl
= &ViewObjectExVtbl
;
3981 script_control
->IPointerInactive_iface
.lpVtbl
= &PointerInactiveVtbl
;
3982 script_control
->IConnectionPointContainer_iface
.lpVtbl
= &ConnectionPointContainerVtbl
;
3983 script_control
->IScriptModuleCollection_iface
.lpVtbl
= &ScriptModuleCollectionVtbl
;
3984 script_control
->ref
= 1;
3985 script_control
->timeout
= 10000;
3986 script_control
->allow_ui
= VARIANT_TRUE
;
3987 script_control
->use_safe_subset
= VARIANT_FALSE
;
3989 script_control
->error
->IScriptError_iface
.lpVtbl
= &ScriptErrorVtbl
;
3990 script_control
->error
->ref
= 1;
3992 ConnectionPoint_Init(&script_control
->cp_scsource
, script_control
, &DIID_DScriptControlSource
);
3993 ConnectionPoint_Init(&script_control
->cp_propnotif
, script_control
, &IID_IPropertyNotifySink
);
3996 dpi_x
= GetDeviceCaps(hdc
, LOGPIXELSX
);
3997 dpi_y
= GetDeviceCaps(hdc
, LOGPIXELSY
);
4000 script_control
->extent
.cx
= MulDiv(38, 2540, dpi_x
);
4001 script_control
->extent
.cy
= MulDiv(38, 2540, dpi_y
);
4003 hres
= IScriptControl_QueryInterface(&script_control
->IScriptControl_iface
, riid
, ppv
);
4004 IScriptControl_Release(&script_control
->IScriptControl_iface
);
4008 /******************************************************************
4009 * DllMain (msscript.ocx.@)
4011 BOOL WINAPI
DllMain(HINSTANCE instance
, DWORD reason
, void *reserved
)
4013 TRACE("(%p %d %p)\n", instance
, reason
, reserved
);
4016 case DLL_PROCESS_ATTACH
:
4017 msscript_instance
= instance
;
4018 DisableThreadLibraryCalls(instance
);
4020 case DLL_PROCESS_DETACH
:
4029 static HRESULT WINAPI
ClassFactory_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **ppv
)
4033 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
4034 TRACE("(%p)->(IID_IUnknown %p)\n", iface
, ppv
);
4036 }else if(IsEqualGUID(&IID_IClassFactory
, riid
)) {
4037 TRACE("(%p)->(IID_IClassFactory %p)\n", iface
, ppv
);
4042 IUnknown_AddRef((IUnknown
*)*ppv
);
4046 WARN("(%p)->(%s %p)\n", iface
, debugstr_guid(riid
), ppv
);
4047 return E_NOINTERFACE
;
4050 static ULONG WINAPI
ClassFactory_AddRef(IClassFactory
*iface
)
4052 TRACE("(%p)\n", iface
);
4056 static ULONG WINAPI
ClassFactory_Release(IClassFactory
*iface
)
4058 TRACE("(%p)\n", iface
);
4062 static HRESULT WINAPI
ClassFactory_LockServer(IClassFactory
*iface
, BOOL fLock
)
4064 TRACE("(%p)->(%x)\n", iface
, fLock
);
4068 static const IClassFactoryVtbl ScriptControlFactoryVtbl
= {
4069 ClassFactory_QueryInterface
,
4070 ClassFactory_AddRef
,
4071 ClassFactory_Release
,
4072 ScriptControl_CreateInstance
,
4073 ClassFactory_LockServer
4076 static IClassFactory ScriptControlFactory
= { &ScriptControlFactoryVtbl
};
4078 /***********************************************************************
4079 * DllGetClassObject (msscript.ocx.@)
4081 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, LPVOID
*ppv
)
4083 if(IsEqualGUID(&CLSID_ScriptControl
, rclsid
)) {
4084 TRACE("(CLSID_ScriptControl %s %p)\n", debugstr_guid(riid
), ppv
);
4085 return IClassFactory_QueryInterface(&ScriptControlFactory
, riid
, ppv
);
4088 FIXME("%s %s %p\n", debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
4089 return CLASS_E_CLASSNOTAVAILABLE
;
4092 /***********************************************************************
4093 * DllCanUnloadNow (msscript.ocx.@)
4095 HRESULT WINAPI
DllCanUnloadNow(void)
4101 /***********************************************************************
4102 * DllRegisterServer (msscript.ocx.@)
4104 HRESULT WINAPI
DllRegisterServer(void)
4107 return __wine_register_resources(msscript_instance
);
4110 /***********************************************************************
4111 * DllUnregisterServer (msscript.ocx.@)
4113 HRESULT WINAPI
DllUnregisterServer(void)
4116 return __wine_unregister_resources(msscript_instance
);