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 ScriptHost ScriptHost
;
56 struct ConnectionPoint
{
57 IConnectionPoint IConnectionPoint_iface
;
58 ScriptControl
*control
;
60 ConnectionPoint
*next
;
70 IScriptModule IScriptModule_iface
;
75 IDispatch
*script_dispatch
;
79 IActiveScriptSite IActiveScriptSite_iface
;
80 IActiveScriptSiteWindow IActiveScriptSiteWindow_iface
;
81 IServiceProvider IServiceProvider_iface
;
84 IActiveScript
*script
;
85 IActiveScriptParse
*parse
;
86 SCRIPTSTATE script_state
;
89 unsigned int module_count
;
90 struct list named_items
;
93 struct ScriptControl
{
94 IScriptControl IScriptControl_iface
;
95 IPersistStreamInit IPersistStreamInit_iface
;
96 IOleObject IOleObject_iface
;
97 IOleControl IOleControl_iface
;
98 IQuickActivate IQuickActivate_iface
;
99 IViewObjectEx IViewObjectEx_iface
;
100 IPointerInactive IPointerInactive_iface
;
101 IConnectionPointContainer IConnectionPointContainer_iface
;
103 IOleClientSite
*site
;
106 VARIANT_BOOL allow_ui
;
107 VARIANT_BOOL use_safe_subset
;
109 /* connection points */
110 ConnectionPoint
*cp_list
;
111 ConnectionPoint cp_scsource
;
112 ConnectionPoint cp_propnotif
;
114 /* IViewObject sink */
115 IAdviseSink
*view_sink
;
116 DWORD view_sink_flags
;
119 ScriptModule
**modules
;
120 IScriptModuleCollection IScriptModuleCollection_iface
;
125 static HINSTANCE msscript_instance
;
129 IScriptModuleCollection_tid
,
134 static ITypeLib
*typelib
;
135 static ITypeInfo
*typeinfos
[LAST_tid
];
137 static REFIID tid_ids
[] = {
139 &IID_IScriptModuleCollection
,
143 static HRESULT
load_typelib(void)
148 hres
= LoadRegTypeLib(&LIBID_MSScriptControl
, 1, 0, LOCALE_SYSTEM_DEFAULT
, &tl
);
150 ERR("LoadRegTypeLib failed: %08x\n", hres
);
154 if(InterlockedCompareExchangePointer((void**)&typelib
, tl
, NULL
))
155 ITypeLib_Release(tl
);
159 static HRESULT
get_typeinfo(tid_t tid
, ITypeInfo
**typeinfo
)
164 hres
= load_typelib();
168 if(!typeinfos
[tid
]) {
171 hres
= ITypeLib_GetTypeInfoOfGuid(typelib
, tid_ids
[tid
], &ti
);
173 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids
[tid
]), hres
);
177 if(InterlockedCompareExchangePointer((void**)(typeinfos
+tid
), ti
, NULL
))
178 ITypeInfo_Release(ti
);
181 *typeinfo
= typeinfos
[tid
];
182 ITypeInfo_AddRef(typeinfos
[tid
]);
186 static void release_typelib(void)
193 for(i
= 0; i
< ARRAY_SIZE(typeinfos
); i
++)
195 ITypeInfo_Release(typeinfos
[i
]);
197 ITypeLib_Release(typelib
);
200 static inline BOOL
is_power_of_2(unsigned x
)
202 return !(x
& (x
- 1));
205 static void clear_named_items(ScriptHost
*host
)
207 struct named_item
*item
, *item1
;
208 LIST_FOR_EACH_ENTRY_SAFE(item
, item1
, &host
->named_items
, struct named_item
, entry
) {
209 list_remove(&item
->entry
);
210 SysFreeString(item
->name
);
211 IDispatch_Release(item
->disp
);
216 static struct named_item
*host_get_named_item(ScriptHost
*host
, const WCHAR
*nameW
)
218 struct named_item
*item
;
220 LIST_FOR_EACH_ENTRY(item
, &host
->named_items
, struct named_item
, entry
) {
221 if (!wcscmp(item
->name
, nameW
))
228 static HRESULT
get_script_dispatch(ScriptModule
*module
, IDispatch
**disp
)
230 if (!module
->script_dispatch
)
232 HRESULT hr
= IActiveScript_GetScriptDispatch(module
->host
->script
,
233 module
->name
, &module
->script_dispatch
);
234 if (FAILED(hr
)) return hr
;
236 *disp
= module
->script_dispatch
;
240 static HRESULT
set_script_state(ScriptHost
*host
, SCRIPTSTATE state
)
244 hr
= IActiveScript_SetScriptState(host
->script
, state
);
246 host
->script_state
= state
;
250 static HRESULT
start_script(ScriptHost
*host
)
254 if (host
->script_state
!= SCRIPTSTATE_STARTED
)
255 hr
= set_script_state(host
, SCRIPTSTATE_STARTED
);
260 static HRESULT
add_script_object(ScriptHost
*host
, BSTR name
, IDispatch
*object
, DWORD flags
)
262 struct named_item
*item
;
265 if (host_get_named_item(host
, name
))
268 item
= heap_alloc(sizeof(*item
));
270 return E_OUTOFMEMORY
;
272 item
->name
= SysAllocString(name
);
276 return E_OUTOFMEMORY
;
278 IDispatch_AddRef(item
->disp
= object
);
279 list_add_tail(&host
->named_items
, &item
->entry
);
281 hr
= IActiveScript_AddNamedItem(host
->script
, name
, flags
);
284 list_remove(&item
->entry
);
285 IDispatch_Release(item
->disp
);
286 SysFreeString(item
->name
);
294 static HRESULT
parse_script_text(ScriptModule
*module
, BSTR script_text
, DWORD flag
, VARIANT
*res
)
299 hr
= start_script(module
->host
);
300 if (FAILED(hr
)) return hr
;
302 hr
= IActiveScriptParse_ParseScriptText(module
->host
->parse
, script_text
, module
->name
,
303 NULL
, NULL
, 0, 1, flag
, res
, &excepinfo
);
304 /* FIXME: more error handling */
308 static inline ScriptControl
*impl_from_IScriptControl(IScriptControl
*iface
)
310 return CONTAINING_RECORD(iface
, ScriptControl
, IScriptControl_iface
);
313 static inline ScriptControl
*impl_from_IOleObject(IOleObject
*iface
)
315 return CONTAINING_RECORD(iface
, ScriptControl
, IOleObject_iface
);
318 static inline ScriptControl
*impl_from_IPersistStreamInit(IPersistStreamInit
*iface
)
320 return CONTAINING_RECORD(iface
, ScriptControl
, IPersistStreamInit_iface
);
323 static inline ScriptControl
*impl_from_IOleControl(IOleControl
*iface
)
325 return CONTAINING_RECORD(iface
, ScriptControl
, IOleControl_iface
);
328 static inline ScriptControl
*impl_from_IQuickActivate(IQuickActivate
*iface
)
330 return CONTAINING_RECORD(iface
, ScriptControl
, IQuickActivate_iface
);
333 static inline ScriptControl
*impl_from_IViewObjectEx(IViewObjectEx
*iface
)
335 return CONTAINING_RECORD(iface
, ScriptControl
, IViewObjectEx_iface
);
338 static inline ScriptControl
*impl_from_IPointerInactive(IPointerInactive
*iface
)
340 return CONTAINING_RECORD(iface
, ScriptControl
, IPointerInactive_iface
);
343 static inline ScriptControl
*impl_from_IConnectionPointContainer(IConnectionPointContainer
*iface
)
345 return CONTAINING_RECORD(iface
, ScriptControl
, IConnectionPointContainer_iface
);
348 static inline ScriptControl
*impl_from_IScriptModuleCollection(IScriptModuleCollection
*iface
)
350 return CONTAINING_RECORD(iface
, ScriptControl
, IScriptModuleCollection_iface
);
353 static inline ScriptModule
*impl_from_IScriptModule(IScriptModule
*iface
)
355 return CONTAINING_RECORD(iface
, ScriptModule
, IScriptModule_iface
);
358 static inline ConnectionPoint
*impl_from_IConnectionPoint(IConnectionPoint
*iface
)
360 return CONTAINING_RECORD(iface
, ConnectionPoint
, IConnectionPoint_iface
);
363 static inline ScriptHost
*impl_from_IActiveScriptSite(IActiveScriptSite
*iface
)
365 return CONTAINING_RECORD(iface
, ScriptHost
, IActiveScriptSite_iface
);
368 static inline ScriptHost
*impl_from_IActiveScriptSiteWindow(IActiveScriptSiteWindow
*iface
)
370 return CONTAINING_RECORD(iface
, ScriptHost
, IActiveScriptSiteWindow_iface
);
373 static inline ScriptHost
*impl_from_IServiceProvider(IServiceProvider
*iface
)
375 return CONTAINING_RECORD(iface
, ScriptHost
, IServiceProvider_iface
);
378 /* IActiveScriptSite */
379 static HRESULT WINAPI
ActiveScriptSite_QueryInterface(IActiveScriptSite
*iface
, REFIID riid
, void **ppv
)
381 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
383 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
384 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
385 *ppv
= &This
->IActiveScriptSite_iface
;
386 }else if(IsEqualGUID(&IID_IActiveScriptSite
, riid
)) {
387 TRACE("(%p)->(IID_IActiveScriptSite %p)\n", This
, ppv
);
388 *ppv
= &This
->IActiveScriptSite_iface
;
389 }else if(IsEqualGUID(&IID_IActiveScriptSiteWindow
, riid
)) {
390 TRACE("(%p)->(IID_IActiveScriptSiteWindow %p)\n", This
, ppv
);
391 *ppv
= &This
->IActiveScriptSiteWindow_iface
;
392 }else if(IsEqualGUID(&IID_IServiceProvider
, riid
)) {
393 TRACE("(%p)->(IID_IServiceProvider %p)\n", This
, ppv
);
394 *ppv
= &This
->IServiceProvider_iface
;
396 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
398 return E_NOINTERFACE
;
401 IUnknown_AddRef((IUnknown
*)*ppv
);
405 static ULONG WINAPI
ActiveScriptSite_AddRef(IActiveScriptSite
*iface
)
407 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
408 LONG ref
= InterlockedIncrement(&This
->ref
);
410 TRACE("(%p) ref=%d\n", This
, ref
);
415 static ULONG WINAPI
ActiveScriptSite_Release(IActiveScriptSite
*iface
)
417 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
418 LONG ref
= InterlockedDecrement(&This
->ref
);
420 TRACE("(%p) ref=%d\n", This
, ref
);
423 clear_named_items(This
);
430 static HRESULT WINAPI
ActiveScriptSite_GetLCID(IActiveScriptSite
*iface
, LCID
*lcid
)
432 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
434 TRACE("(%p, %p)\n", This
, lcid
);
436 *lcid
= GetUserDefaultLCID();
440 static HRESULT WINAPI
ActiveScriptSite_GetItemInfo(IActiveScriptSite
*iface
, LPCOLESTR name
, DWORD mask
,
441 IUnknown
**unk
, ITypeInfo
**ti
)
443 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
444 struct named_item
*item
;
446 TRACE("(%p, %s, %#x, %p, %p)\n", This
, debugstr_w(name
), mask
, unk
, ti
);
448 item
= host_get_named_item(This
, name
);
450 return TYPE_E_ELEMENTNOTFOUND
;
452 if (mask
!= SCRIPTINFO_IUNKNOWN
) {
453 FIXME("mask %#x is not supported\n", mask
);
457 *unk
= (IUnknown
*)item
->disp
;
458 IUnknown_AddRef(*unk
);
463 static HRESULT WINAPI
ActiveScriptSite_GetDocVersionString(IActiveScriptSite
*iface
, BSTR
*version
)
465 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
467 FIXME("(%p, %p)\n", This
, version
);
472 static HRESULT WINAPI
ActiveScriptSite_OnScriptTerminate(IActiveScriptSite
*iface
, const VARIANT
*result
,
475 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
477 FIXME("(%p, %s, %p)\n", This
, debugstr_variant(result
), ei
);
482 static HRESULT WINAPI
ActiveScriptSite_OnStateChange(IActiveScriptSite
*iface
, SCRIPTSTATE state
)
484 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
486 FIXME("(%p, %d)\n", This
, state
);
491 static HRESULT WINAPI
ActiveScriptSite_OnScriptError(IActiveScriptSite
*iface
, IActiveScriptError
*script_error
)
493 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
495 FIXME("(%p, %p)\n", This
, script_error
);
500 static HRESULT WINAPI
ActiveScriptSite_OnEnterScript(IActiveScriptSite
*iface
)
502 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
504 FIXME("(%p)\n", This
);
509 static HRESULT WINAPI
ActiveScriptSite_OnLeaveScript(IActiveScriptSite
*iface
)
511 ScriptHost
*This
= impl_from_IActiveScriptSite(iface
);
513 FIXME("(%p)\n", This
);
518 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl
= {
519 ActiveScriptSite_QueryInterface
,
520 ActiveScriptSite_AddRef
,
521 ActiveScriptSite_Release
,
522 ActiveScriptSite_GetLCID
,
523 ActiveScriptSite_GetItemInfo
,
524 ActiveScriptSite_GetDocVersionString
,
525 ActiveScriptSite_OnScriptTerminate
,
526 ActiveScriptSite_OnStateChange
,
527 ActiveScriptSite_OnScriptError
,
528 ActiveScriptSite_OnEnterScript
,
529 ActiveScriptSite_OnLeaveScript
532 /* IActiveScriptSiteWindow */
533 static HRESULT WINAPI
ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow
*iface
, REFIID riid
, void **obj
)
535 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
536 return IActiveScriptSite_QueryInterface(&This
->IActiveScriptSite_iface
, riid
, obj
);
539 static ULONG WINAPI
ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow
*iface
)
541 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
542 return IActiveScriptSite_AddRef(&This
->IActiveScriptSite_iface
);
545 static ULONG WINAPI
ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow
*iface
)
547 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
548 return IActiveScriptSite_Release(&This
->IActiveScriptSite_iface
);
551 static HRESULT WINAPI
ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow
*iface
, HWND
*hwnd
)
553 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
555 FIXME("(%p, %p)\n", This
, hwnd
);
560 static HRESULT WINAPI
ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow
*iface
, BOOL enable
)
562 ScriptHost
*This
= impl_from_IActiveScriptSiteWindow(iface
);
564 FIXME("(%p, %d)\n", This
, enable
);
569 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl
= {
570 ActiveScriptSiteWindow_QueryInterface
,
571 ActiveScriptSiteWindow_AddRef
,
572 ActiveScriptSiteWindow_Release
,
573 ActiveScriptSiteWindow_GetWindow
,
574 ActiveScriptSiteWindow_EnableModeless
577 /* IServiceProvider */
578 static HRESULT WINAPI
ServiceProvider_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **obj
)
580 ScriptHost
*This
= impl_from_IServiceProvider(iface
);
581 return IActiveScriptSite_QueryInterface(&This
->IActiveScriptSite_iface
, riid
, obj
);
584 static ULONG WINAPI
ServiceProvider_AddRef(IServiceProvider
*iface
)
586 ScriptHost
*This
= impl_from_IServiceProvider(iface
);
587 return IActiveScriptSite_AddRef(&This
->IActiveScriptSite_iface
);
590 static ULONG WINAPI
ServiceProvider_Release(IServiceProvider
*iface
)
592 ScriptHost
*This
= impl_from_IServiceProvider(iface
);
593 return IActiveScriptSite_Release(&This
->IActiveScriptSite_iface
);
596 static HRESULT WINAPI
ServiceProvider_QueryService(IServiceProvider
*iface
, REFGUID service
,
597 REFIID riid
, void **obj
)
599 ScriptHost
*This
= impl_from_IServiceProvider(iface
);
601 FIXME("(%p)->(%s %s %p)\n", This
, debugstr_guid(service
), debugstr_guid(riid
), obj
);
606 static const IServiceProviderVtbl ServiceProviderVtbl
= {
607 ServiceProvider_QueryInterface
,
608 ServiceProvider_AddRef
,
609 ServiceProvider_Release
,
610 ServiceProvider_QueryService
613 static void detach_script_host(ScriptHost
*host
)
615 if (--host
->module_count
)
619 IActiveScript_Close(host
->script
);
620 IActiveScript_Release(host
->script
);
624 IActiveScriptParse_Release(host
->parse
);
630 static void detach_module(ScriptModule
*module
)
632 ScriptHost
*host
= module
->host
;
636 detach_script_host(host
);
637 IActiveScriptSite_Release(&host
->IActiveScriptSite_iface
);
641 static HRESULT WINAPI
ScriptModule_QueryInterface(IScriptModule
*iface
, REFIID riid
, void **ppv
)
643 ScriptModule
*This
= impl_from_IScriptModule(iface
);
645 if (IsEqualGUID(&IID_IDispatch
, riid
) || IsEqualGUID(&IID_IUnknown
, riid
) ||
646 IsEqualGUID(&IID_IScriptModule
, riid
))
648 *ppv
= &This
->IScriptModule_iface
;
652 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
654 return E_NOINTERFACE
;
657 IUnknown_AddRef((IUnknown
*)*ppv
);
661 static ULONG WINAPI
ScriptModule_AddRef(IScriptModule
*iface
)
663 ScriptModule
*This
= impl_from_IScriptModule(iface
);
664 LONG ref
= InterlockedIncrement(&This
->ref
);
666 TRACE("(%p) ref=%d\n", This
, ref
);
671 static ULONG WINAPI
ScriptModule_Release(IScriptModule
*iface
)
673 ScriptModule
*This
= impl_from_IScriptModule(iface
);
674 LONG ref
= InterlockedDecrement(&This
->ref
);
676 TRACE("(%p) ref=%d\n", This
, ref
);
681 SysFreeString(This
->name
);
682 if (This
->script_dispatch
)
683 IDispatch_Release(This
->script_dispatch
);
690 static HRESULT WINAPI
ScriptModule_GetTypeInfoCount(IScriptModule
*iface
, UINT
*pctinfo
)
692 ScriptModule
*This
= impl_from_IScriptModule(iface
);
694 TRACE("(%p)->(%p)\n", This
, pctinfo
);
700 static HRESULT WINAPI
ScriptModule_GetTypeInfo(IScriptModule
*iface
, UINT iTInfo
,
701 LCID lcid
, ITypeInfo
**ppTInfo
)
703 ScriptModule
*This
= impl_from_IScriptModule(iface
);
705 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
707 return get_typeinfo(IScriptModule_tid
, ppTInfo
);
710 static HRESULT WINAPI
ScriptModule_GetIDsOfNames(IScriptModule
*iface
, REFIID riid
,
711 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
713 ScriptModule
*This
= impl_from_IScriptModule(iface
);
717 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
719 hr
= get_typeinfo(IScriptModule_tid
, &typeinfo
);
722 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
723 ITypeInfo_Release(typeinfo
);
729 static HRESULT WINAPI
ScriptModule_Invoke(IScriptModule
*iface
, DISPID dispIdMember
,
730 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
731 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
733 ScriptModule
*This
= impl_from_IScriptModule(iface
);
737 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
738 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
740 hr
= get_typeinfo(IScriptModule_tid
, &typeinfo
);
743 hr
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
744 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
745 ITypeInfo_Release(typeinfo
);
751 static HRESULT WINAPI
ScriptModule_get_Name(IScriptModule
*iface
, BSTR
*pbstrName
)
753 ScriptModule
*This
= impl_from_IScriptModule(iface
);
755 TRACE("(%p)->(%p)\n", This
, pbstrName
);
757 if (!pbstrName
) return E_POINTER
;
758 if (!This
->host
) return E_FAIL
;
760 *pbstrName
= SysAllocString(This
->name
? This
->name
: L
"Global");
761 return *pbstrName
? S_OK
: E_OUTOFMEMORY
;
764 static HRESULT WINAPI
ScriptModule_get_CodeObject(IScriptModule
*iface
, IDispatch
**ppdispObject
)
766 ScriptModule
*This
= impl_from_IScriptModule(iface
);
768 FIXME("(%p)->(%p)\n", This
, ppdispObject
);
773 static HRESULT WINAPI
ScriptModule_get_Procedures(IScriptModule
*iface
, IScriptProcedureCollection
**ppdispProcedures
)
775 ScriptModule
*This
= impl_from_IScriptModule(iface
);
777 FIXME("(%p)->(%p)\n", This
, ppdispProcedures
);
782 static HRESULT WINAPI
ScriptModule_AddCode(IScriptModule
*iface
, BSTR code
)
784 ScriptModule
*This
= impl_from_IScriptModule(iface
);
786 TRACE("(%p)->(%s)\n", This
, debugstr_w(code
));
791 return parse_script_text(This
, code
, SCRIPTTEXT_ISVISIBLE
, NULL
);
794 static HRESULT WINAPI
ScriptModule_Eval(IScriptModule
*iface
, BSTR expression
, VARIANT
*res
)
796 ScriptModule
*This
= impl_from_IScriptModule(iface
);
798 TRACE("(%p)->(%s, %p)\n", This
, debugstr_w(expression
), res
);
802 V_VT(res
) = VT_EMPTY
;
806 return parse_script_text(This
, expression
, SCRIPTTEXT_ISEXPRESSION
, res
);
809 static HRESULT WINAPI
ScriptModule_ExecuteStatement(IScriptModule
*iface
, BSTR statement
)
811 ScriptModule
*This
= impl_from_IScriptModule(iface
);
813 TRACE("(%p)->(%s)\n", This
, debugstr_w(statement
));
818 return parse_script_text(This
, statement
, 0, NULL
);
821 static HRESULT WINAPI
ScriptModule_Run(IScriptModule
*iface
, BSTR procedure_name
, SAFEARRAY
**parameters
, VARIANT
*res
)
823 ScriptModule
*This
= impl_from_IScriptModule(iface
);
825 FIXME("(%p)->(%s %p %p)\n", This
, debugstr_w(procedure_name
), parameters
, res
);
830 static const IScriptModuleVtbl ScriptModuleVtbl
= {
831 ScriptModule_QueryInterface
,
833 ScriptModule_Release
,
834 ScriptModule_GetTypeInfoCount
,
835 ScriptModule_GetTypeInfo
,
836 ScriptModule_GetIDsOfNames
,
838 ScriptModule_get_Name
,
839 ScriptModule_get_CodeObject
,
840 ScriptModule_get_Procedures
,
841 ScriptModule_AddCode
,
843 ScriptModule_ExecuteStatement
,
847 static ScriptModule
*create_module(ScriptHost
*host
, BSTR name
)
849 ScriptModule
*module
;
851 if (!(module
= heap_alloc(sizeof(*module
)))) return NULL
;
853 module
->IScriptModule_iface
.lpVtbl
= &ScriptModuleVtbl
;
856 if (name
&& !(module
->name
= SysAllocString(name
)))
862 module
->script_dispatch
= NULL
;
863 IActiveScriptSite_AddRef(&host
->IActiveScriptSite_iface
);
867 static void release_modules(ScriptControl
*control
, BOOL force_detach
)
869 unsigned int i
, module_count
= control
->host
->module_count
;
871 for (i
= 0; i
< module_count
; i
++) {
872 if (force_detach
) detach_module(control
->modules
[i
]);
873 IScriptModule_Release(&control
->modules
[i
]->IScriptModule_iface
);
876 heap_free(control
->modules
);
879 static ScriptModule
*find_module(ScriptControl
*control
, BSTR name
)
883 if (!wcsicmp(name
, L
"Global"))
884 return control
->modules
[0];
886 for (i
= 1; i
< control
->host
->module_count
; i
++)
888 if (!wcsicmp(name
, control
->modules
[i
]->name
))
889 return control
->modules
[i
];
894 static HRESULT WINAPI
ScriptModuleCollection_QueryInterface(IScriptModuleCollection
*iface
, REFIID riid
, void **ppv
)
896 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
898 if (IsEqualGUID(&IID_IDispatch
, riid
) || IsEqualGUID(&IID_IUnknown
, riid
) ||
899 IsEqualGUID(&IID_IScriptModuleCollection
, riid
))
901 *ppv
= &This
->IScriptModuleCollection_iface
;
905 WARN("unsupported interface: (%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
907 return E_NOINTERFACE
;
910 IUnknown_AddRef((IUnknown
*)*ppv
);
914 static ULONG WINAPI
ScriptModuleCollection_AddRef(IScriptModuleCollection
*iface
)
916 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
917 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
920 static ULONG WINAPI
ScriptModuleCollection_Release(IScriptModuleCollection
*iface
)
922 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
923 return IScriptControl_Release(&This
->IScriptControl_iface
);
926 static HRESULT WINAPI
ScriptModuleCollection_GetTypeInfoCount(IScriptModuleCollection
*iface
, UINT
*pctinfo
)
928 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
930 TRACE("(%p)->(%p)\n", This
, pctinfo
);
936 static HRESULT WINAPI
ScriptModuleCollection_GetTypeInfo(IScriptModuleCollection
*iface
, UINT iTInfo
,
937 LCID lcid
, ITypeInfo
**ppTInfo
)
939 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
941 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
943 return get_typeinfo(IScriptModuleCollection_tid
, ppTInfo
);
946 static HRESULT WINAPI
ScriptModuleCollection_GetIDsOfNames(IScriptModuleCollection
*iface
, REFIID riid
,
947 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
949 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
953 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
955 hr
= get_typeinfo(IScriptModuleCollection_tid
, &typeinfo
);
958 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
959 ITypeInfo_Release(typeinfo
);
965 static HRESULT WINAPI
ScriptModuleCollection_Invoke(IScriptModuleCollection
*iface
, DISPID dispIdMember
,
966 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
967 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
969 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
973 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
974 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
976 hr
= get_typeinfo(IScriptModuleCollection_tid
, &typeinfo
);
979 hr
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
980 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
981 ITypeInfo_Release(typeinfo
);
987 static HRESULT WINAPI
ScriptModuleCollection_get__NewEnum(IScriptModuleCollection
*iface
, IUnknown
**ppenumContexts
)
989 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
991 FIXME("(%p)->(%p)\n", This
, ppenumContexts
);
996 static HRESULT WINAPI
ScriptModuleCollection_get_Item(IScriptModuleCollection
*iface
, VARIANT index
,
997 IScriptModule
**ppmod
)
999 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
1000 ScriptModule
*module
;
1004 TRACE("(%p)->(%s %p)\n", This
, wine_dbgstr_variant(&index
), ppmod
);
1006 if (!ppmod
) return E_POINTER
;
1007 if (!This
->host
) return E_FAIL
;
1009 if (V_VT(&index
) == VT_BSTR
)
1011 module
= find_module(This
, V_BSTR(&index
));
1012 if (!module
) return CTL_E_ILLEGALFUNCTIONCALL
;
1016 hr
= VariantChangeType(&index
, &index
, 0, VT_INT
);
1017 if (FAILED(hr
)) return hr
;
1019 i
= V_INT(&index
) - 1;
1020 if (i
>= This
->host
->module_count
) return 0x800a0009;
1022 module
= This
->modules
[i
];
1025 *ppmod
= &module
->IScriptModule_iface
;
1026 IScriptModule_AddRef(*ppmod
);
1030 static HRESULT WINAPI
ScriptModuleCollection_get_Count(IScriptModuleCollection
*iface
, LONG
*plCount
)
1032 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
1034 TRACE("(%p)->(%p)\n", This
, plCount
);
1036 if (!plCount
) return E_POINTER
;
1037 if (!This
->host
) return E_FAIL
;
1039 *plCount
= This
->host
->module_count
;
1043 static HRESULT WINAPI
ScriptModuleCollection_Add(IScriptModuleCollection
*iface
, BSTR name
,
1044 VARIANT
*object
, IScriptModule
**ppmod
)
1046 ScriptControl
*This
= impl_from_IScriptModuleCollection(iface
);
1047 ScriptModule
*module
, **modules
;
1048 ScriptHost
*host
= This
->host
;
1051 TRACE("(%p)->(%s %s %p)\n", This
, wine_dbgstr_w(name
), wine_dbgstr_variant(object
), ppmod
);
1053 if (!ppmod
) return E_POINTER
;
1054 if (!name
|| V_VT(object
) != VT_DISPATCH
) return E_INVALIDARG
;
1055 if (!host
) return E_FAIL
;
1056 if (find_module(This
, name
)) return E_INVALIDARG
;
1058 /* See if we need to grow the array */
1059 if (is_power_of_2(host
->module_count
))
1061 modules
= heap_realloc(This
->modules
, host
->module_count
* 2 * sizeof(*This
->modules
));
1062 if (!modules
) return E_OUTOFMEMORY
;
1063 This
->modules
= modules
;
1066 if (!(module
= create_module(host
, name
)))
1067 return E_OUTOFMEMORY
;
1069 /* If no object, Windows only calls AddNamedItem without adding a NULL object */
1070 if (V_DISPATCH(object
))
1071 hr
= add_script_object(host
, name
, V_DISPATCH(object
), 0);
1073 hr
= IActiveScript_AddNamedItem(host
->script
, name
, SCRIPTITEM_CODEONLY
);
1077 IScriptModule_Release(&module
->IScriptModule_iface
);
1080 This
->modules
[host
->module_count
++] = module
;
1082 *ppmod
= &module
->IScriptModule_iface
;
1083 IScriptModule_AddRef(*ppmod
);
1087 static const IScriptModuleCollectionVtbl ScriptModuleCollectionVtbl
= {
1088 ScriptModuleCollection_QueryInterface
,
1089 ScriptModuleCollection_AddRef
,
1090 ScriptModuleCollection_Release
,
1091 ScriptModuleCollection_GetTypeInfoCount
,
1092 ScriptModuleCollection_GetTypeInfo
,
1093 ScriptModuleCollection_GetIDsOfNames
,
1094 ScriptModuleCollection_Invoke
,
1095 ScriptModuleCollection_get__NewEnum
,
1096 ScriptModuleCollection_get_Item
,
1097 ScriptModuleCollection_get_Count
,
1098 ScriptModuleCollection_Add
1101 static HRESULT
init_script_host(const CLSID
*clsid
, ScriptHost
**ret
)
1103 IObjectSafety
*objsafety
;
1109 host
= heap_alloc(sizeof(*host
));
1111 return E_OUTOFMEMORY
;
1113 host
->IActiveScriptSite_iface
.lpVtbl
= &ActiveScriptSiteVtbl
;
1114 host
->IActiveScriptSiteWindow_iface
.lpVtbl
= &ActiveScriptSiteWindowVtbl
;
1115 host
->IServiceProvider_iface
.lpVtbl
= &ServiceProviderVtbl
;
1117 host
->script
= NULL
;
1119 host
->clsid
= *clsid
;
1120 host
->module_count
= 1;
1121 list_init(&host
->named_items
);
1123 hr
= CoCreateInstance(&host
->clsid
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
1124 &IID_IActiveScript
, (void**)&host
->script
);
1126 WARN("Failed to create an instance for %s, %#x\n", debugstr_guid(clsid
), hr
);
1130 hr
= IActiveScript_QueryInterface(host
->script
, &IID_IObjectSafety
, (void**)&objsafety
);
1132 FIXME("Could not get IObjectSafety, %#x\n", hr
);
1136 hr
= IObjectSafety_SetInterfaceSafetyOptions(objsafety
, &IID_IActiveScriptParse
, INTERFACESAFE_FOR_UNTRUSTED_DATA
, 0);
1137 IObjectSafety_Release(objsafety
);
1139 FIXME("SetInterfaceSafetyOptions failed, %#x\n", hr
);
1143 hr
= IActiveScript_SetScriptSite(host
->script
, &host
->IActiveScriptSite_iface
);
1145 WARN("SetScriptSite failed, %#x\n", hr
);
1149 hr
= IActiveScript_QueryInterface(host
->script
, &IID_IActiveScriptParse
, (void**)&host
->parse
);
1151 WARN("Failed to get IActiveScriptParse, %#x\n", hr
);
1155 hr
= IActiveScriptParse_InitNew(host
->parse
);
1157 WARN("InitNew failed, %#x\n", hr
);
1160 host
->script_state
= SCRIPTSTATE_INITIALIZED
;
1166 detach_script_host(host
);
1170 static HRESULT WINAPI
ScriptControl_QueryInterface(IScriptControl
*iface
, REFIID riid
, void **ppv
)
1172 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1174 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
1175 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
1176 *ppv
= &This
->IScriptControl_iface
;
1177 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
1178 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
1179 *ppv
= &This
->IScriptControl_iface
;
1180 }else if(IsEqualGUID(&IID_IScriptControl
, riid
)) {
1181 TRACE("(%p)->(IID_IScriptControl %p)\n", This
, ppv
);
1182 *ppv
= &This
->IScriptControl_iface
;
1183 }else if(IsEqualGUID(&IID_IOleObject
, riid
)) {
1184 TRACE("(%p)->(IID_IOleObject %p)\n", This
, ppv
);
1185 *ppv
= &This
->IOleObject_iface
;
1186 }else if(IsEqualGUID(&IID_IPersistStreamInit
, riid
)) {
1187 TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This
, ppv
);
1188 *ppv
= &This
->IPersistStreamInit_iface
;
1189 }else if(IsEqualGUID(&IID_IPersist
, riid
)) {
1190 TRACE("(%p)->(IID_IPersist %p)\n", This
, ppv
);
1191 *ppv
= &This
->IPersistStreamInit_iface
;
1192 }else if(IsEqualGUID(&IID_IOleControl
, riid
)) {
1193 TRACE("(%p)->(IID_IOleControl %p)\n", This
, ppv
);
1194 *ppv
= &This
->IOleControl_iface
;
1195 }else if(IsEqualGUID(&IID_IQuickActivate
, riid
)) {
1196 TRACE("(%p)->(IID_IQuickActivate %p)\n", This
, ppv
);
1197 *ppv
= &This
->IQuickActivate_iface
;
1198 }else if(IsEqualGUID(&IID_IViewObject
, riid
)) {
1199 TRACE("(%p)->(IID_IViewObject %p)\n", This
, ppv
);
1200 *ppv
= &This
->IViewObjectEx_iface
;
1201 }else if(IsEqualGUID(&IID_IViewObject2
, riid
)) {
1202 TRACE("(%p)->(IID_IViewObject2 %p)\n", This
, ppv
);
1203 *ppv
= &This
->IViewObjectEx_iface
;
1204 }else if(IsEqualGUID(&IID_IViewObjectEx
, riid
)) {
1205 TRACE("(%p)->(IID_IViewObjectEx %p)\n", This
, ppv
);
1206 *ppv
= &This
->IViewObjectEx_iface
;
1207 }else if(IsEqualGUID(&IID_IPointerInactive
, riid
)) {
1208 TRACE("(%p)->(IID_IPointerInactive %p)\n", This
, ppv
);
1209 *ppv
= &This
->IPointerInactive_iface
;
1210 }else if(IsEqualGUID(&IID_IConnectionPointContainer
, riid
)) {
1211 TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This
, ppv
);
1212 *ppv
= &This
->IConnectionPointContainer_iface
;
1214 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
1216 return E_NOINTERFACE
;
1219 IUnknown_AddRef((IUnknown
*)*ppv
);
1223 static ULONG WINAPI
ScriptControl_AddRef(IScriptControl
*iface
)
1225 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1226 LONG ref
= InterlockedIncrement(&This
->ref
);
1228 TRACE("(%p) ref=%d\n", This
, ref
);
1233 static ULONG WINAPI
ScriptControl_Release(IScriptControl
*iface
)
1235 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1236 LONG ref
= InterlockedDecrement(&This
->ref
);
1238 TRACE("(%p) ref=%d\n", This
, ref
);
1242 IOleClientSite_Release(This
->site
);
1245 release_modules(This
, FALSE
);
1246 IActiveScriptSite_Release(&This
->host
->IActiveScriptSite_iface
);
1254 static HRESULT WINAPI
ScriptControl_GetTypeInfoCount(IScriptControl
*iface
, UINT
*pctinfo
)
1256 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1257 TRACE("(%p)->(%p)\n", This
, pctinfo
);
1262 static HRESULT WINAPI
ScriptControl_GetTypeInfo(IScriptControl
*iface
, UINT iTInfo
,
1263 LCID lcid
, ITypeInfo
**ppTInfo
)
1265 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1266 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1267 return get_typeinfo(IScriptControl_tid
, ppTInfo
);
1270 static HRESULT WINAPI
ScriptControl_GetIDsOfNames(IScriptControl
*iface
, REFIID riid
,
1271 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1273 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1274 ITypeInfo
*typeinfo
;
1277 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
1279 hres
= get_typeinfo(IScriptControl_tid
, &typeinfo
);
1280 if(SUCCEEDED(hres
)) {
1281 hres
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1282 ITypeInfo_Release(typeinfo
);
1288 static HRESULT WINAPI
ScriptControl_Invoke(IScriptControl
*iface
, DISPID dispIdMember
,
1289 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
1290 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1292 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1293 ITypeInfo
*typeinfo
;
1296 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1297 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1299 hres
= get_typeinfo(IScriptControl_tid
, &typeinfo
);
1300 if(SUCCEEDED(hres
)) {
1301 hres
= ITypeInfo_Invoke(typeinfo
, iface
, dispIdMember
, wFlags
,
1302 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1303 ITypeInfo_Release(typeinfo
);
1309 static HRESULT WINAPI
ScriptControl_get_Language(IScriptControl
*iface
, BSTR
*p
)
1311 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1315 TRACE("(%p)->(%p)\n", This
, p
);
1325 hr
= ProgIDFromCLSID(&This
->host
->clsid
, &progidW
);
1329 *p
= SysAllocString(progidW
);
1330 CoTaskMemFree(progidW
);
1331 return *p
? S_OK
: E_OUTOFMEMORY
;
1334 static HRESULT WINAPI
ScriptControl_put_Language(IScriptControl
*iface
, BSTR language
)
1336 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1340 TRACE("(%p)->(%s)\n", This
, debugstr_w(language
));
1342 if (language
&& FAILED(CLSIDFromProgID(language
, &clsid
)))
1343 return CTL_E_INVALIDPROPERTYVALUE
;
1346 release_modules(This
, TRUE
);
1347 IActiveScriptSite_Release(&This
->host
->IActiveScriptSite_iface
);
1354 hres
= init_script_host(&clsid
, &This
->host
);
1358 /* Alloc global module */
1359 This
->modules
= heap_alloc_zero(sizeof(*This
->modules
));
1360 if (This
->modules
) {
1361 This
->modules
[0] = create_module(This
->host
, NULL
);
1362 if (!This
->modules
[0]) {
1363 heap_free(This
->modules
);
1364 This
->modules
= NULL
;
1365 hres
= E_OUTOFMEMORY
;
1369 hres
= E_OUTOFMEMORY
;
1372 detach_script_host(This
->host
);
1378 static HRESULT WINAPI
ScriptControl_get_State(IScriptControl
*iface
, ScriptControlStates
*p
)
1380 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1384 TRACE("(%p)->(%p)\n", This
, p
);
1392 hres
= IActiveScript_GetScriptState(This
->host
->script
, &state
);
1393 if (FAILED(hres
)) return hres
;
1397 case SCRIPTSTATE_INITIALIZED
:
1398 case SCRIPTSTATE_STARTED
:
1401 case SCRIPTSTATE_CONNECTED
:
1405 WARN("unexpected state %d\n", state
);
1411 static HRESULT WINAPI
ScriptControl_put_State(IScriptControl
*iface
, ScriptControlStates state
)
1413 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1414 TRACE("(%p)->(%x)\n", This
, state
);
1419 if(state
!= Initialized
&& state
!= Connected
)
1420 return CTL_E_INVALIDPROPERTYVALUE
;
1422 return IActiveScript_SetScriptState(This
->host
->script
, state
== Connected
? SCRIPTSTATE_CONNECTED
: SCRIPTSTATE_STARTED
);
1425 static HRESULT WINAPI
ScriptControl_put_SitehWnd(IScriptControl
*iface
, LONG hwnd
)
1427 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1429 FIXME("(%p)->(%x)\n", This
, hwnd
);
1434 static HRESULT WINAPI
ScriptControl_get_SitehWnd(IScriptControl
*iface
, LONG
*p
)
1436 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1437 FIXME("(%p)->(%p)\n", This
, p
);
1441 static HRESULT WINAPI
ScriptControl_get_Timeout(IScriptControl
*iface
, LONG
*p
)
1443 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1445 TRACE("(%p)->(%p)\n", This
, p
);
1454 static HRESULT WINAPI
ScriptControl_put_Timeout(IScriptControl
*iface
, LONG timeout
)
1456 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1458 TRACE("(%p)->(%d)\n", This
, timeout
);
1461 return CTL_E_INVALIDPROPERTYVALUE
;
1464 FIXME("execution timeout ignored\n");
1466 This
->timeout
= timeout
;
1470 static HRESULT WINAPI
ScriptControl_get_AllowUI(IScriptControl
*iface
, VARIANT_BOOL
*p
)
1472 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1473 TRACE("(%p)->(%p)\n", This
, p
);
1478 *p
= This
->allow_ui
;
1482 static HRESULT WINAPI
ScriptControl_put_AllowUI(IScriptControl
*iface
, VARIANT_BOOL allow_ui
)
1484 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1485 TRACE("(%p)->(%x)\n", This
, allow_ui
);
1487 This
->allow_ui
= allow_ui
;
1491 static HRESULT WINAPI
ScriptControl_get_UseSafeSubset(IScriptControl
*iface
, VARIANT_BOOL
*p
)
1493 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1494 TRACE("(%p)->(%p)\n", This
, p
);
1499 *p
= This
->use_safe_subset
;
1503 static HRESULT WINAPI
ScriptControl_put_UseSafeSubset(IScriptControl
*iface
, VARIANT_BOOL use_safe_subset
)
1505 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1506 TRACE("(%p)->(%x)\n", This
, use_safe_subset
);
1508 This
->use_safe_subset
= use_safe_subset
;
1512 static HRESULT WINAPI
ScriptControl_get_Modules(IScriptControl
*iface
, IScriptModuleCollection
**p
)
1514 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1516 TRACE("(%p)->(%p)\n", This
, p
);
1518 if (!This
->host
) return E_FAIL
;
1520 *p
= &This
->IScriptModuleCollection_iface
;
1521 IScriptControl_AddRef(iface
);
1525 static HRESULT WINAPI
ScriptControl_get_Error(IScriptControl
*iface
, IScriptError
**p
)
1527 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1528 FIXME("(%p)->(%p)\n", This
, p
);
1532 static HRESULT WINAPI
ScriptControl_get_CodeObject(IScriptControl
*iface
, IDispatch
**p
)
1534 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1535 FIXME("(%p)->(%p)\n", This
, p
);
1539 static HRESULT WINAPI
ScriptControl_get_Procedures(IScriptControl
*iface
, IScriptProcedureCollection
**p
)
1541 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1542 FIXME("(%p)->(%p)\n", This
, p
);
1546 static HRESULT WINAPI
ScriptControl__AboutBox(IScriptControl
*iface
)
1548 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1549 FIXME("(%p)\n", This
);
1553 static HRESULT WINAPI
ScriptControl_AddObject(IScriptControl
*iface
, BSTR name
, IDispatch
*object
, VARIANT_BOOL add_members
)
1555 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1556 DWORD flags
= SCRIPTITEM_ISVISIBLE
| SCRIPTITEM_ISSOURCE
;
1558 TRACE("(%p)->(%s %p %x)\n", This
, debugstr_w(name
), object
, add_members
);
1561 return E_INVALIDARG
;
1567 flags
|= SCRIPTITEM_GLOBALMEMBERS
;
1568 return add_script_object(This
->host
, name
, object
, flags
);
1571 static HRESULT WINAPI
ScriptControl_Reset(IScriptControl
*iface
)
1573 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1575 TRACE("(%p)\n", This
);
1580 clear_named_items(This
->host
);
1581 return set_script_state(This
->host
, SCRIPTSTATE_INITIALIZED
);
1584 static HRESULT WINAPI
ScriptControl_AddCode(IScriptControl
*iface
, BSTR code
)
1586 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1588 TRACE("(%p)->(%s).\n", This
, debugstr_w(code
));
1593 return parse_script_text(This
->modules
[0], code
, SCRIPTTEXT_ISVISIBLE
, NULL
);
1596 static HRESULT WINAPI
ScriptControl_Eval(IScriptControl
*iface
, BSTR expression
, VARIANT
*res
)
1598 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1600 TRACE("(%p)->(%s, %p).\n", This
, debugstr_w(expression
), res
);
1604 V_VT(res
) = VT_EMPTY
;
1608 return parse_script_text(This
->modules
[0], expression
, SCRIPTTEXT_ISEXPRESSION
, res
);
1611 static HRESULT WINAPI
ScriptControl_ExecuteStatement(IScriptControl
*iface
, BSTR statement
)
1613 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1615 TRACE("(%p)->(%s)\n", This
, debugstr_w(statement
));
1620 return parse_script_text(This
->modules
[0], statement
, 0, NULL
);
1623 static HRESULT WINAPI
ScriptControl_Run(IScriptControl
*iface
, BSTR procedure_name
, SAFEARRAY
**parameters
, VARIANT
*res
)
1625 ScriptControl
*This
= impl_from_IScriptControl(iface
);
1626 IDispatchEx
*dispex
;
1634 TRACE("(%p)->(%s %p %p)\n", This
, debugstr_w(procedure_name
), parameters
, res
);
1636 if (!parameters
|| !res
) return E_POINTER
;
1637 if (!(sa
= *parameters
)) return E_POINTER
;
1639 V_VT(res
) = VT_EMPTY
;
1640 if (sa
->cDims
== 0) return DISP_E_BADINDEX
;
1641 if (!(sa
->fFeatures
& FADF_VARIANT
)) return DISP_E_BADVARTYPE
;
1644 if (!This
->host
) return E_FAIL
;
1645 hr
= start_script(This
->host
);
1646 if (FAILED(hr
)) return hr
;
1648 hr
= get_script_dispatch(This
->modules
[0], &disp
);
1649 if (FAILED(hr
)) return hr
;
1651 hr
= IDispatch_GetIDsOfNames(disp
, &IID_NULL
, &procedure_name
, 1, LOCALE_USER_DEFAULT
, &dispid
);
1652 if (FAILED(hr
)) return hr
;
1654 dp
.cArgs
= sa
->rgsabound
[0].cElements
;
1655 dp
.rgdispidNamedArgs
= NULL
;
1657 dp
.rgvarg
= heap_alloc(dp
.cArgs
* sizeof(*dp
.rgvarg
));
1658 if (!dp
.rgvarg
) return E_OUTOFMEMORY
;
1660 hr
= SafeArrayLock(sa
);
1663 /* The DISPPARAMS are stored in reverse order */
1664 for (i
= 0; i
< dp
.cArgs
; i
++)
1665 dp
.rgvarg
[i
] = *(VARIANT
*)((char*)(sa
->pvData
) + (dp
.cArgs
- i
- 1) * sa
->cbElements
);
1666 SafeArrayUnlock(sa
);
1668 hr
= IDispatch_QueryInterface(disp
, &IID_IDispatchEx
, (void**)&dispex
);
1671 hr
= IDispatch_Invoke(disp
, dispid
, &IID_NULL
, LOCALE_USER_DEFAULT
,
1672 DISPATCH_METHOD
, &dp
, res
, NULL
, NULL
);
1676 hr
= IDispatchEx_InvokeEx(dispex
, dispid
, LOCALE_USER_DEFAULT
,
1677 DISPATCH_METHOD
, &dp
, res
, NULL
, NULL
);
1678 IDispatchEx_Release(dispex
);
1681 heap_free(dp
.rgvarg
);
1686 static const IScriptControlVtbl ScriptControlVtbl
= {
1687 ScriptControl_QueryInterface
,
1688 ScriptControl_AddRef
,
1689 ScriptControl_Release
,
1690 ScriptControl_GetTypeInfoCount
,
1691 ScriptControl_GetTypeInfo
,
1692 ScriptControl_GetIDsOfNames
,
1693 ScriptControl_Invoke
,
1694 ScriptControl_get_Language
,
1695 ScriptControl_put_Language
,
1696 ScriptControl_get_State
,
1697 ScriptControl_put_State
,
1698 ScriptControl_put_SitehWnd
,
1699 ScriptControl_get_SitehWnd
,
1700 ScriptControl_get_Timeout
,
1701 ScriptControl_put_Timeout
,
1702 ScriptControl_get_AllowUI
,
1703 ScriptControl_put_AllowUI
,
1704 ScriptControl_get_UseSafeSubset
,
1705 ScriptControl_put_UseSafeSubset
,
1706 ScriptControl_get_Modules
,
1707 ScriptControl_get_Error
,
1708 ScriptControl_get_CodeObject
,
1709 ScriptControl_get_Procedures
,
1710 ScriptControl__AboutBox
,
1711 ScriptControl_AddObject
,
1712 ScriptControl_Reset
,
1713 ScriptControl_AddCode
,
1715 ScriptControl_ExecuteStatement
,
1719 static HRESULT WINAPI
OleObject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **obj
)
1721 ScriptControl
*This
= impl_from_IOleObject(iface
);
1722 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
1725 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
1727 ScriptControl
*This
= impl_from_IOleObject(iface
);
1728 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
1731 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
1733 ScriptControl
*This
= impl_from_IOleObject(iface
);
1734 return IScriptControl_Release(&This
->IScriptControl_iface
);
1737 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, IOleClientSite
*site
)
1739 ScriptControl
*This
= impl_from_IOleObject(iface
);
1741 TRACE("(%p)->(%p)\n", This
, site
);
1744 IOleClientSite_Release(This
->site
);
1746 if ((This
->site
= site
))
1747 IOleClientSite_AddRef(site
);
1752 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, IOleClientSite
**site
)
1754 ScriptControl
*This
= impl_from_IOleObject(iface
);
1756 TRACE("(%p)->(%p)\n", This
, site
);
1761 if ((*site
= This
->site
))
1762 IOleClientSite_AddRef(*site
);
1767 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR containerapp
, LPCOLESTR containerobj
)
1769 ScriptControl
*This
= impl_from_IOleObject(iface
);
1771 FIXME("(%p)->(%s %s)\n", This
, debugstr_w(containerapp
), debugstr_w(containerobj
));
1776 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD save
)
1778 ScriptControl
*This
= impl_from_IOleObject(iface
);
1780 FIXME("(%p)->(%d)\n", This
, save
);
1785 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD which
, IMoniker
*moniker
)
1787 ScriptControl
*This
= impl_from_IOleObject(iface
);
1789 FIXME("(%p)->(%d %p)\n", This
, which
, moniker
);
1794 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD assign
, DWORD which
, IMoniker
**moniker
)
1796 ScriptControl
*This
= impl_from_IOleObject(iface
);
1798 FIXME("(%p)->(%d %d %p)\n", This
, assign
, which
, moniker
);
1803 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, IDataObject
*dataobj
, BOOL creation
,
1806 ScriptControl
*This
= impl_from_IOleObject(iface
);
1808 FIXME("(%p)->(%p %d %d)\n", This
, dataobj
, creation
, reserved
);
1813 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD reserved
, IDataObject
**dataobj
)
1815 ScriptControl
*This
= impl_from_IOleObject(iface
);
1817 FIXME("(%p)->(%d %p)\n", This
, reserved
, dataobj
);
1822 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG verb
, LPMSG msg
, IOleClientSite
*active_site
,
1823 LONG index
, HWND hwndParent
, LPCRECT rect
)
1825 ScriptControl
*This
= impl_from_IOleObject(iface
);
1827 FIXME("(%p)->(%d %p %p %d %p %p)\n", This
, verb
, msg
, active_site
, index
, hwndParent
, rect
);
1832 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**enumoleverb
)
1834 ScriptControl
*This
= impl_from_IOleObject(iface
);
1836 FIXME("(%p)->(%p)\n", This
, enumoleverb
);
1841 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
1843 ScriptControl
*This
= impl_from_IOleObject(iface
);
1845 FIXME("(%p)\n", This
);
1850 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
1852 ScriptControl
*This
= impl_from_IOleObject(iface
);
1854 FIXME("(%p)\n", This
);
1859 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
*clsid
)
1861 ScriptControl
*This
= impl_from_IOleObject(iface
);
1863 FIXME("(%p)->(%p)\n", This
, clsid
);
1868 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD form_of_type
, LPOLESTR
*usertype
)
1870 ScriptControl
*This
= impl_from_IOleObject(iface
);
1872 FIXME("(%p)->(%d %p)\n", This
, form_of_type
, usertype
);
1877 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD aspect
, SIZEL
*size
)
1879 ScriptControl
*This
= impl_from_IOleObject(iface
);
1881 FIXME("(%p)->(%d %p)\n", This
, aspect
, size
);
1886 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD aspect
, SIZEL
*size
)
1888 ScriptControl
*This
= impl_from_IOleObject(iface
);
1890 TRACE("(%p)->(%d %p)\n", This
, aspect
, size
);
1892 if (aspect
!= DVASPECT_CONTENT
)
1893 return DV_E_DVASPECT
;
1895 *size
= This
->extent
;
1899 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*sink
, DWORD
*connection
)
1901 ScriptControl
*This
= impl_from_IOleObject(iface
);
1903 FIXME("(%p)->(%p %p)\n", This
, sink
, connection
);
1908 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD connection
)
1910 ScriptControl
*This
= impl_from_IOleObject(iface
);
1912 FIXME("(%p)->(%d)\n", This
, connection
);
1917 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**enumadvise
)
1919 ScriptControl
*This
= impl_from_IOleObject(iface
);
1921 FIXME("(%p)->(%p)\n", This
, enumadvise
);
1926 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD aspect
, DWORD
*status
)
1928 ScriptControl
*This
= impl_from_IOleObject(iface
);
1930 TRACE("(%p)->(%d %p)\n", This
, aspect
, status
);
1932 return OleRegGetMiscStatus(&CLSID_ScriptControl
, aspect
, status
);
1935 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
*logpal
)
1937 ScriptControl
*This
= impl_from_IOleObject(iface
);
1939 FIXME("(%p)->(%p)\n", This
, logpal
);
1944 static const IOleObjectVtbl OleObjectVtbl
= {
1945 OleObject_QueryInterface
,
1948 OleObject_SetClientSite
,
1949 OleObject_GetClientSite
,
1950 OleObject_SetHostNames
,
1952 OleObject_SetMoniker
,
1953 OleObject_GetMoniker
,
1954 OleObject_InitFromData
,
1955 OleObject_GetClipboardData
,
1957 OleObject_EnumVerbs
,
1959 OleObject_IsUpToDate
,
1960 OleObject_GetUserClassID
,
1961 OleObject_GetUserType
,
1962 OleObject_SetExtent
,
1963 OleObject_GetExtent
,
1966 OleObject_EnumAdvise
,
1967 OleObject_GetMiscStatus
,
1968 OleObject_SetColorScheme
1971 static HRESULT WINAPI
PersistStreamInit_QueryInterface(IPersistStreamInit
*iface
, REFIID riid
, void **obj
)
1973 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
1974 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
1977 static ULONG WINAPI
PersistStreamInit_AddRef(IPersistStreamInit
*iface
)
1979 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
1980 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
1983 static ULONG WINAPI
PersistStreamInit_Release(IPersistStreamInit
*iface
)
1985 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
1986 return IScriptControl_Release(&This
->IScriptControl_iface
);
1989 static HRESULT WINAPI
PersistStreamInit_GetClassID(IPersistStreamInit
*iface
, CLSID
*clsid
)
1991 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
1993 FIXME("(%p)->(%p)\n", This
, clsid
);
1998 static HRESULT WINAPI
PersistStreamInit_IsDirty(IPersistStreamInit
*iface
)
2000 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
2002 FIXME("(%p)\n", This
);
2007 static HRESULT WINAPI
PersistStreamInit_Load(IPersistStreamInit
*iface
, IStream
*stream
)
2009 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
2011 FIXME("(%p)->(%p)\n", This
, stream
);
2016 static HRESULT WINAPI
PersistStreamInit_Save(IPersistStreamInit
*iface
, IStream
*stream
, BOOL clear_dirty
)
2018 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
2020 FIXME("(%p)->(%p %d)\n", This
, stream
, clear_dirty
);
2025 static HRESULT WINAPI
PersistStreamInit_GetSizeMax(IPersistStreamInit
*iface
, ULARGE_INTEGER
*size
)
2027 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
2029 FIXME("(%p)->(%p)\n", This
, size
);
2034 static HRESULT WINAPI
PersistStreamInit_InitNew(IPersistStreamInit
*iface
)
2036 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
2038 FIXME("(%p)\n", This
);
2043 static const IPersistStreamInitVtbl PersistStreamInitVtbl
= {
2044 PersistStreamInit_QueryInterface
,
2045 PersistStreamInit_AddRef
,
2046 PersistStreamInit_Release
,
2047 PersistStreamInit_GetClassID
,
2048 PersistStreamInit_IsDirty
,
2049 PersistStreamInit_Load
,
2050 PersistStreamInit_Save
,
2051 PersistStreamInit_GetSizeMax
,
2052 PersistStreamInit_InitNew
2055 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
, REFIID riid
, void **obj
)
2057 ScriptControl
*This
= impl_from_IOleControl(iface
);
2058 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
2061 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
2063 ScriptControl
*This
= impl_from_IOleControl(iface
);
2064 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
2067 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
2069 ScriptControl
*This
= impl_from_IOleControl(iface
);
2070 return IScriptControl_Release(&This
->IScriptControl_iface
);
2073 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, CONTROLINFO
*info
)
2075 ScriptControl
*This
= impl_from_IOleControl(iface
);
2077 TRACE("(%p)->(%p)\n", This
, info
);
2082 info
->hAccel
= NULL
;
2088 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, MSG
*msg
)
2090 ScriptControl
*This
= impl_from_IOleControl(iface
);
2092 FIXME("(%p)->(%p)\n", This
, msg
);
2097 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispid
)
2099 ScriptControl
*This
= impl_from_IOleControl(iface
);
2101 FIXME("(%p)->(%#x)\n", This
, dispid
);
2106 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL freeze
)
2108 ScriptControl
*This
= impl_from_IOleControl(iface
);
2110 FIXME("(%p)->(%d)\n", This
, freeze
);
2115 static const IOleControlVtbl OleControlVtbl
= {
2116 OleControl_QueryInterface
,
2119 OleControl_GetControlInfo
,
2120 OleControl_OnMnemonic
,
2121 OleControl_OnAmbientPropertyChange
,
2122 OleControl_FreezeEvents
2125 static HRESULT WINAPI
QuickActivate_QueryInterface(IQuickActivate
*iface
, REFIID riid
, void **obj
)
2127 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
2128 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
2131 static ULONG WINAPI
QuickActivate_AddRef(IQuickActivate
*iface
)
2133 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
2134 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
2137 static ULONG WINAPI
QuickActivate_Release(IQuickActivate
*iface
)
2139 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
2140 return IScriptControl_Release(&This
->IScriptControl_iface
);
2143 static HRESULT WINAPI
QuickActivate_QuickActivate(IQuickActivate
*iface
, QACONTAINER
*container
, QACONTROL
*control
)
2145 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
2147 FIXME("(%p)->(%p %p)\n", This
, container
, control
);
2152 static HRESULT WINAPI
QuickActivate_SetContentExtent(IQuickActivate
*iface
, SIZEL
*size
)
2154 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
2156 FIXME("(%p)->(%p)\n", This
, size
);
2161 static HRESULT WINAPI
QuickActivate_GetContentExtent(IQuickActivate
*iface
, SIZEL
*size
)
2163 ScriptControl
*This
= impl_from_IQuickActivate(iface
);
2165 FIXME("(%p)->(%p)\n", This
, size
);
2170 static const IQuickActivateVtbl QuickActivateVtbl
= {
2171 QuickActivate_QueryInterface
,
2172 QuickActivate_AddRef
,
2173 QuickActivate_Release
,
2174 QuickActivate_QuickActivate
,
2175 QuickActivate_SetContentExtent
,
2176 QuickActivate_GetContentExtent
2179 static HRESULT WINAPI
ViewObject_QueryInterface(IViewObjectEx
*iface
, REFIID riid
, void **obj
)
2181 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2182 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
2185 static ULONG WINAPI
ViewObject_AddRef(IViewObjectEx
*iface
)
2187 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2188 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
2191 static ULONG WINAPI
ViewObject_Release(IViewObjectEx
*iface
)
2193 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2194 return IScriptControl_Release(&This
->IScriptControl_iface
);
2197 static HRESULT WINAPI
ViewObject_Draw(IViewObjectEx
*iface
, DWORD drawaspect
, LONG index
, void *aspect
,
2198 DVTARGETDEVICE
*device
, HDC target_dev
, HDC hdc_draw
, const RECTL
*bounds
, const RECTL
*win_bounds
,
2199 BOOL (STDMETHODCALLTYPE
*fn_continue
)(ULONG_PTR cont
), ULONG_PTR cont
)
2201 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2203 FIXME("(%p)->(%d %d %p %p %p %p %p %p %p %lu)\n", This
, drawaspect
, index
, aspect
, device
, target_dev
,
2204 hdc_draw
, bounds
, win_bounds
, fn_continue
, cont
);
2209 static HRESULT WINAPI
ViewObject_GetColorSet(IViewObjectEx
*iface
, DWORD drawaspect
, LONG index
, void *aspect
,
2210 DVTARGETDEVICE
*device
, HDC hic_target
, LOGPALETTE
**colorset
)
2212 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2214 FIXME("(%p)->(%d %d %p %p %p %p)\n", This
, drawaspect
, index
, aspect
, device
, hic_target
,
2220 static HRESULT WINAPI
ViewObject_Freeze(IViewObjectEx
*iface
, DWORD drawaspect
, LONG index
, void *aspect
,
2223 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2225 FIXME("(%p)->(%d %d %p %p)\n", This
, drawaspect
, index
, aspect
, freeze
);
2230 static HRESULT WINAPI
ViewObject_Unfreeze(IViewObjectEx
*iface
, DWORD freeze
)
2232 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2234 FIXME("(%p)->(%d)\n", This
, freeze
);
2239 static HRESULT WINAPI
ViewObject_SetAdvise(IViewObjectEx
*iface
, DWORD aspects
, DWORD flags
, IAdviseSink
*sink
)
2241 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2243 TRACE("(%p)->(%d %#x %p)\n", This
, aspects
, flags
, sink
);
2245 if (aspects
!= DVASPECT_CONTENT
)
2246 return DV_E_DVASPECT
;
2248 This
->view_sink_flags
= flags
;
2249 if (This
->view_sink
)
2250 IAdviseSink_Release(This
->view_sink
);
2251 This
->view_sink
= sink
;
2252 if (This
->view_sink
)
2253 IAdviseSink_AddRef(This
->view_sink
);
2258 static HRESULT WINAPI
ViewObject_GetAdvise(IViewObjectEx
*iface
, DWORD
*aspects
, DWORD
*flags
, IAdviseSink
**sink
)
2260 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2262 TRACE("(%p)->(%p %p %p)\n", This
, aspects
, flags
, sink
);
2265 *aspects
= DVASPECT_CONTENT
;
2267 *flags
= This
->view_sink_flags
;
2269 *sink
= This
->view_sink
;
2271 IAdviseSink_AddRef(*sink
);
2277 static HRESULT WINAPI
ViewObject_GetExtent(IViewObjectEx
*iface
, DWORD draw_aspect
, LONG index
,
2278 DVTARGETDEVICE
*device
, SIZEL
*size
)
2280 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2282 FIXME("(%p)->(%d %d %p %p)\n", This
, draw_aspect
, index
, device
, size
);
2287 static HRESULT WINAPI
ViewObject_GetRect(IViewObjectEx
*iface
, DWORD aspect
, RECTL
*rect
)
2289 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2291 FIXME("(%p)->(%d %p)\n", This
, aspect
, rect
);
2296 static HRESULT WINAPI
ViewObject_GetViewStatus(IViewObjectEx
*iface
, DWORD
*status
)
2298 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2300 TRACE("(%p)->(%p)\n", This
, status
);
2302 *status
= VIEWSTATUS_OPAQUE
;
2306 static HRESULT WINAPI
ViewObject_QueryHitPoint(IViewObjectEx
*iface
, DWORD aspect
, const RECT
*bounds
,
2307 POINT pt
, LONG close_hint
, DWORD
*hit_result
)
2309 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2311 FIXME("(%p)->(%d %s %s %d %p)\n", This
, aspect
, wine_dbgstr_rect(bounds
), wine_dbgstr_point(&pt
), close_hint
, hit_result
);
2316 static HRESULT WINAPI
ViewObject_QueryHitRect(IViewObjectEx
*iface
, DWORD aspect
, const RECT
*bounds
,
2317 const RECT
*loc
, LONG close_hint
, DWORD
*hit_result
)
2319 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2321 FIXME("(%p)->(%d %s %s %d %p)\n", This
, aspect
, wine_dbgstr_rect(bounds
), wine_dbgstr_rect(loc
), close_hint
, hit_result
);
2326 static HRESULT WINAPI
ViewObject_GetNaturalExtent(IViewObjectEx
*iface
, DWORD aspect
, LONG index
,
2327 DVTARGETDEVICE
*device
, HDC target_hdc
, DVEXTENTINFO
*extent_info
, SIZEL
*size
)
2329 ScriptControl
*This
= impl_from_IViewObjectEx(iface
);
2331 FIXME("(%p)->(%d %d %p %p %p %p)\n", This
, aspect
, index
, device
, target_hdc
, extent_info
, size
);
2336 static const IViewObjectExVtbl ViewObjectExVtbl
= {
2337 ViewObject_QueryInterface
,
2341 ViewObject_GetColorSet
,
2343 ViewObject_Unfreeze
,
2344 ViewObject_SetAdvise
,
2345 ViewObject_GetAdvise
,
2346 ViewObject_GetExtent
,
2348 ViewObject_GetViewStatus
,
2349 ViewObject_QueryHitPoint
,
2350 ViewObject_QueryHitRect
,
2351 ViewObject_GetNaturalExtent
2354 static HRESULT WINAPI
PointerInactive_QueryInterface(IPointerInactive
*iface
, REFIID riid
, void **obj
)
2356 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
2357 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
2360 static ULONG WINAPI
PointerInactive_AddRef(IPointerInactive
*iface
)
2362 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
2363 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
2366 static ULONG WINAPI
PointerInactive_Release(IPointerInactive
*iface
)
2368 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
2369 return IScriptControl_Release(&This
->IScriptControl_iface
);
2372 static HRESULT WINAPI
PointerInactive_GetActivationPolicy(IPointerInactive
*iface
, DWORD
*policy
)
2374 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
2376 TRACE("(%p)->(%p)\n", This
, policy
);
2385 static HRESULT WINAPI
PointerInactive_OnInactiveMouseMove(IPointerInactive
*iface
, const RECT
*bounds
,
2386 LONG x
, LONG y
, DWORD key_state
)
2388 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
2390 FIXME("(%p)->(%s %d %d %#x)\n", This
, wine_dbgstr_rect(bounds
), x
, y
, key_state
);
2395 static HRESULT WINAPI
PointerInactive_OnInactiveSetCursor(IPointerInactive
*iface
, const RECT
*bounds
,
2396 LONG x
, LONG y
, DWORD msg
, BOOL set_always
)
2398 ScriptControl
*This
= impl_from_IPointerInactive(iface
);
2400 FIXME("(%p)->(%s %d %d %#x %d)\n", This
, wine_dbgstr_rect(bounds
), x
, y
, msg
, set_always
);
2405 static const IPointerInactiveVtbl PointerInactiveVtbl
= {
2406 PointerInactive_QueryInterface
,
2407 PointerInactive_AddRef
,
2408 PointerInactive_Release
,
2409 PointerInactive_GetActivationPolicy
,
2410 PointerInactive_OnInactiveMouseMove
,
2411 PointerInactive_OnInactiveSetCursor
2414 static HRESULT WINAPI
ConnectionPointContainer_QueryInterface(IConnectionPointContainer
*iface
, REFIID riid
, void **obj
)
2416 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
2417 return IScriptControl_QueryInterface(&This
->IScriptControl_iface
, riid
, obj
);
2420 static ULONG WINAPI
ConnectionPointContainer_AddRef(IConnectionPointContainer
*iface
)
2422 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
2423 return IScriptControl_AddRef(&This
->IScriptControl_iface
);
2426 static ULONG WINAPI
ConnectionPointContainer_Release(IConnectionPointContainer
*iface
)
2428 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
2429 return IScriptControl_Release(&This
->IScriptControl_iface
);
2432 static HRESULT WINAPI
ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer
*iface
, IEnumConnectionPoints
**enum_points
)
2434 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
2436 FIXME("(%p)->(%p)\n", This
, enum_points
);
2441 static HRESULT WINAPI
ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer
*iface
, REFIID riid
, IConnectionPoint
**cp
)
2443 ScriptControl
*This
= impl_from_IConnectionPointContainer(iface
);
2444 ConnectionPoint
*iter
;
2446 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), cp
);
2450 for (iter
= This
->cp_list
; iter
; iter
= iter
->next
) {
2451 if (IsEqualIID(iter
->riid
, riid
))
2452 *cp
= &iter
->IConnectionPoint_iface
;
2456 IConnectionPoint_AddRef(*cp
);
2460 FIXME("unsupported connection point %s\n", debugstr_guid(riid
));
2461 return CONNECT_E_NOCONNECTION
;
2464 static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl
= {
2465 ConnectionPointContainer_QueryInterface
,
2466 ConnectionPointContainer_AddRef
,
2467 ConnectionPointContainer_Release
,
2468 ConnectionPointContainer_EnumConnectionPoints
,
2469 ConnectionPointContainer_FindConnectionPoint
2472 static HRESULT WINAPI
ConnectionPoint_QueryInterface(IConnectionPoint
*iface
,
2473 REFIID riid
, void **ppv
)
2475 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
2477 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
2478 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
2479 *ppv
= &This
->IConnectionPoint_iface
;
2480 }else if(IsEqualGUID(&IID_IConnectionPoint
, riid
)) {
2481 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
2482 *ppv
= &This
->IConnectionPoint_iface
;
2484 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
2486 return E_NOINTERFACE
;
2489 IUnknown_AddRef((IUnknown
*)*ppv
);
2493 static ULONG WINAPI
ConnectionPoint_AddRef(IConnectionPoint
*iface
)
2495 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
2496 return IConnectionPointContainer_AddRef(&This
->control
->IConnectionPointContainer_iface
);
2499 static ULONG WINAPI
ConnectionPoint_Release(IConnectionPoint
*iface
)
2501 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
2502 return IConnectionPointContainer_Release(&This
->control
->IConnectionPointContainer_iface
);
2505 static HRESULT WINAPI
ConnectionPoint_GetConnectionInterface(IConnectionPoint
*iface
, IID
*iid
)
2507 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
2509 TRACE("(%p)->(%p)\n", This
, iid
);
2515 static HRESULT WINAPI
ConnectionPoint_GetConnectionPointContainer(IConnectionPoint
*iface
,
2516 IConnectionPointContainer
**container
)
2518 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
2520 TRACE("(%p)->(%p)\n", This
, container
);
2525 *container
= &This
->control
->IConnectionPointContainer_iface
;
2526 IConnectionPointContainer_AddRef(*container
);
2531 static HRESULT WINAPI
ConnectionPoint_Advise(IConnectionPoint
*iface
, IUnknown
*unk_sink
,
2534 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
2536 FIXME("(%p)->(%p %p)\n", This
, unk_sink
, cookie
);
2541 static HRESULT WINAPI
ConnectionPoint_Unadvise(IConnectionPoint
*iface
, DWORD cookie
)
2543 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
2545 FIXME("(%p)->(%d)\n", This
, cookie
);
2550 static HRESULT WINAPI
ConnectionPoint_EnumConnections(IConnectionPoint
*iface
,
2551 IEnumConnections
**ppEnum
)
2553 ConnectionPoint
*This
= impl_from_IConnectionPoint(iface
);
2555 FIXME("(%p)->(%p): stub\n", This
, ppEnum
);
2560 static const IConnectionPointVtbl ConnectionPointVtbl
=
2562 ConnectionPoint_QueryInterface
,
2563 ConnectionPoint_AddRef
,
2564 ConnectionPoint_Release
,
2565 ConnectionPoint_GetConnectionInterface
,
2566 ConnectionPoint_GetConnectionPointContainer
,
2567 ConnectionPoint_Advise
,
2568 ConnectionPoint_Unadvise
,
2569 ConnectionPoint_EnumConnections
2572 static void ConnectionPoint_Init(ConnectionPoint
*cp
, ScriptControl
*sc
, REFIID riid
)
2574 cp
->IConnectionPoint_iface
.lpVtbl
= &ConnectionPointVtbl
;
2578 cp
->next
= sc
->cp_list
;
2582 static HRESULT WINAPI
ScriptControl_CreateInstance(IClassFactory
*iface
, IUnknown
*outer
, REFIID riid
, void **ppv
)
2584 ScriptControl
*script_control
;
2589 TRACE("(%p %s %p)\n", outer
, debugstr_guid(riid
), ppv
);
2591 script_control
= heap_alloc_zero(sizeof(*script_control
));
2593 return E_OUTOFMEMORY
;
2595 script_control
->IScriptControl_iface
.lpVtbl
= &ScriptControlVtbl
;
2596 script_control
->IPersistStreamInit_iface
.lpVtbl
= &PersistStreamInitVtbl
;
2597 script_control
->IOleObject_iface
.lpVtbl
= &OleObjectVtbl
;
2598 script_control
->IOleControl_iface
.lpVtbl
= &OleControlVtbl
;
2599 script_control
->IQuickActivate_iface
.lpVtbl
= &QuickActivateVtbl
;
2600 script_control
->IViewObjectEx_iface
.lpVtbl
= &ViewObjectExVtbl
;
2601 script_control
->IPointerInactive_iface
.lpVtbl
= &PointerInactiveVtbl
;
2602 script_control
->IConnectionPointContainer_iface
.lpVtbl
= &ConnectionPointContainerVtbl
;
2603 script_control
->IScriptModuleCollection_iface
.lpVtbl
= &ScriptModuleCollectionVtbl
;
2604 script_control
->ref
= 1;
2605 script_control
->timeout
= 10000;
2606 script_control
->allow_ui
= VARIANT_TRUE
;
2607 script_control
->use_safe_subset
= VARIANT_FALSE
;
2609 ConnectionPoint_Init(&script_control
->cp_scsource
, script_control
, &DIID_DScriptControlSource
);
2610 ConnectionPoint_Init(&script_control
->cp_propnotif
, script_control
, &IID_IPropertyNotifySink
);
2613 dpi_x
= GetDeviceCaps(hdc
, LOGPIXELSX
);
2614 dpi_y
= GetDeviceCaps(hdc
, LOGPIXELSY
);
2617 script_control
->extent
.cx
= MulDiv(38, 2540, dpi_x
);
2618 script_control
->extent
.cy
= MulDiv(38, 2540, dpi_y
);
2620 hres
= IScriptControl_QueryInterface(&script_control
->IScriptControl_iface
, riid
, ppv
);
2621 IScriptControl_Release(&script_control
->IScriptControl_iface
);
2625 /******************************************************************
2626 * DllMain (msscript.ocx.@)
2628 BOOL WINAPI
DllMain(HINSTANCE instance
, DWORD reason
, void *reserved
)
2630 TRACE("(%p %d %p)\n", instance
, reason
, reserved
);
2633 case DLL_WINE_PREATTACH
:
2634 return FALSE
; /* prefer native version */
2635 case DLL_PROCESS_ATTACH
:
2636 msscript_instance
= instance
;
2637 DisableThreadLibraryCalls(instance
);
2639 case DLL_PROCESS_DETACH
:
2648 static HRESULT WINAPI
ClassFactory_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **ppv
)
2652 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
2653 TRACE("(%p)->(IID_IUnknown %p)\n", iface
, ppv
);
2655 }else if(IsEqualGUID(&IID_IClassFactory
, riid
)) {
2656 TRACE("(%p)->(IID_IClassFactory %p)\n", iface
, ppv
);
2661 IUnknown_AddRef((IUnknown
*)*ppv
);
2665 WARN("(%p)->(%s %p)\n", iface
, debugstr_guid(riid
), ppv
);
2666 return E_NOINTERFACE
;
2669 static ULONG WINAPI
ClassFactory_AddRef(IClassFactory
*iface
)
2671 TRACE("(%p)\n", iface
);
2675 static ULONG WINAPI
ClassFactory_Release(IClassFactory
*iface
)
2677 TRACE("(%p)\n", iface
);
2681 static HRESULT WINAPI
ClassFactory_LockServer(IClassFactory
*iface
, BOOL fLock
)
2683 TRACE("(%p)->(%x)\n", iface
, fLock
);
2687 static const IClassFactoryVtbl ScriptControlFactoryVtbl
= {
2688 ClassFactory_QueryInterface
,
2689 ClassFactory_AddRef
,
2690 ClassFactory_Release
,
2691 ScriptControl_CreateInstance
,
2692 ClassFactory_LockServer
2695 static IClassFactory ScriptControlFactory
= { &ScriptControlFactoryVtbl
};
2697 /***********************************************************************
2698 * DllGetClassObject (msscript.ocx.@)
2700 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, LPVOID
*ppv
)
2702 if(IsEqualGUID(&CLSID_ScriptControl
, rclsid
)) {
2703 TRACE("(CLSID_ScriptControl %s %p)\n", debugstr_guid(riid
), ppv
);
2704 return IClassFactory_QueryInterface(&ScriptControlFactory
, riid
, ppv
);
2707 FIXME("%s %s %p\n", debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
2708 return CLASS_E_CLASSNOTAVAILABLE
;
2711 /***********************************************************************
2712 * DllCanUnloadNow (msscript.ocx.@)
2714 HRESULT WINAPI
DllCanUnloadNow(void)
2720 /***********************************************************************
2721 * DllRegisterServer (msscript.ocx.@)
2723 HRESULT WINAPI
DllRegisterServer(void)
2726 return __wine_register_resources(msscript_instance
);
2729 /***********************************************************************
2730 * DllUnregisterServer (msscript.ocx.@)
2732 HRESULT WINAPI
DllUnregisterServer(void)
2735 return __wine_unregister_resources(msscript_instance
);