msscript.ocx: Implement parse_script_text on top of modules.
[wine.git] / dlls / msscript.ocx / msscript.c
blob7fc7b9570f3516af638ddf20da2bf211d6f9b4d1
1 /*
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
19 #define COBJMACROS
21 #include "windows.h"
22 #include "initguid.h"
23 #include "dispex.h"
24 #include "ole2.h"
25 #include "olectl.h"
26 #include "objsafe.h"
27 #include "activscp.h"
28 #include "rpcproxy.h"
29 #include "msscript.h"
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);
38 #ifdef _WIN64
40 #define IActiveScriptParse_Release IActiveScriptParse64_Release
41 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
42 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
44 #else
46 #define IActiveScriptParse_Release IActiveScriptParse32_Release
47 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
48 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
50 #endif
52 struct ScriptControl;
53 typedef struct ConnectionPoint ConnectionPoint;
54 typedef struct ScriptHost ScriptHost;
56 struct ConnectionPoint {
57 IConnectionPoint IConnectionPoint_iface;
58 ScriptControl *control;
59 const IID *riid;
60 ConnectionPoint *next;
63 struct named_item {
64 struct list entry;
65 BSTR name;
66 IDispatch *disp;
69 typedef struct {
70 IScriptModule IScriptModule_iface;
71 LONG ref;
73 BSTR name;
74 ScriptHost *host;
75 IDispatch *script_dispatch;
76 } ScriptModule;
78 struct ScriptHost {
79 IActiveScriptSite IActiveScriptSite_iface;
80 IActiveScriptSiteWindow IActiveScriptSiteWindow_iface;
81 IServiceProvider IServiceProvider_iface;
82 LONG ref;
84 IActiveScript *script;
85 IActiveScriptParse *parse;
86 SCRIPTSTATE script_state;
87 CLSID clsid;
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;
102 LONG ref;
103 IOleClientSite *site;
104 SIZEL extent;
105 LONG timeout;
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;
118 /* modules */
119 ScriptModule **modules;
120 IScriptModuleCollection IScriptModuleCollection_iface;
122 ScriptHost *host;
125 static HINSTANCE msscript_instance;
127 typedef enum tid_t {
128 IScriptControl_tid,
129 IScriptModuleCollection_tid,
130 IScriptModule_tid,
131 LAST_tid
132 } tid_t;
134 static ITypeLib *typelib;
135 static ITypeInfo *typeinfos[LAST_tid];
137 static REFIID tid_ids[] = {
138 &IID_IScriptControl,
139 &IID_IScriptModuleCollection,
140 &IID_IScriptModule
143 static HRESULT load_typelib(void)
145 HRESULT hres;
146 ITypeLib *tl;
148 hres = LoadRegTypeLib(&LIBID_MSScriptControl, 1, 0, LOCALE_SYSTEM_DEFAULT, &tl);
149 if(FAILED(hres)) {
150 ERR("LoadRegTypeLib failed: %08x\n", hres);
151 return hres;
154 if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
155 ITypeLib_Release(tl);
156 return hres;
159 static HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
161 HRESULT hres;
163 if (!typelib)
164 hres = load_typelib();
165 if (!typelib)
166 return hres;
168 if(!typeinfos[tid]) {
169 ITypeInfo *ti;
171 hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
172 if(FAILED(hres)) {
173 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres);
174 return hres;
177 if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL))
178 ITypeInfo_Release(ti);
181 *typeinfo = typeinfos[tid];
182 ITypeInfo_AddRef(typeinfos[tid]);
183 return S_OK;
186 static void release_typelib(void)
188 unsigned i;
190 if(!typelib)
191 return;
193 for(i = 0; i < ARRAY_SIZE(typeinfos); i++)
194 if(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);
212 heap_free(item);
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))
222 return item;
225 return NULL;
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;
237 return S_OK;
240 static HRESULT set_script_state(ScriptHost *host, SCRIPTSTATE state)
242 HRESULT hr;
244 hr = IActiveScript_SetScriptState(host->script, state);
245 if (SUCCEEDED(hr))
246 host->script_state = state;
247 return hr;
250 static HRESULT start_script(ScriptHost *host)
252 HRESULT hr = S_OK;
254 if (host->script_state != SCRIPTSTATE_STARTED)
255 hr = set_script_state(host, SCRIPTSTATE_STARTED);
257 return hr;
260 static HRESULT add_script_object(ScriptHost *host, BSTR name, IDispatch *object, DWORD flags)
262 struct named_item *item;
263 HRESULT hr;
265 if (host_get_named_item(host, name))
266 return E_INVALIDARG;
268 item = heap_alloc(sizeof(*item));
269 if (!item)
270 return E_OUTOFMEMORY;
272 item->name = SysAllocString(name);
273 if (!item->name)
275 heap_free(item);
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);
282 if (FAILED(hr))
284 list_remove(&item->entry);
285 IDispatch_Release(item->disp);
286 SysFreeString(item->name);
287 heap_free(item);
288 return hr;
291 return hr;
294 static HRESULT parse_script_text(ScriptModule *module, BSTR script_text, DWORD flag, VARIANT *res)
296 EXCEPINFO excepinfo;
297 HRESULT hr;
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 */
305 return hr;
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;
395 }else {
396 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
397 *ppv = NULL;
398 return E_NOINTERFACE;
401 IUnknown_AddRef((IUnknown*)*ppv);
402 return S_OK;
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);
412 return 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);
422 if(!ref) {
423 clear_named_items(This);
424 heap_free(This);
427 return ref;
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();
437 return S_OK;
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);
449 if (!item)
450 return TYPE_E_ELEMENTNOTFOUND;
452 if (mask != SCRIPTINFO_IUNKNOWN) {
453 FIXME("mask %#x is not supported\n", mask);
454 return E_NOTIMPL;
457 *unk = (IUnknown*)item->disp;
458 IUnknown_AddRef(*unk);
460 return S_OK;
463 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *version)
465 ScriptHost *This = impl_from_IActiveScriptSite(iface);
467 FIXME("(%p, %p)\n", This, version);
469 return E_NOTIMPL;
472 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, const VARIANT *result,
473 const EXCEPINFO *ei)
475 ScriptHost *This = impl_from_IActiveScriptSite(iface);
477 FIXME("(%p, %s, %p)\n", This, debugstr_variant(result), ei);
479 return E_NOTIMPL;
482 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE state)
484 ScriptHost *This = impl_from_IActiveScriptSite(iface);
486 FIXME("(%p, %d)\n", This, state);
488 return E_NOTIMPL;
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);
497 return E_NOTIMPL;
500 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
502 ScriptHost *This = impl_from_IActiveScriptSite(iface);
504 FIXME("(%p)\n", This);
506 return E_NOTIMPL;
509 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
511 ScriptHost *This = impl_from_IActiveScriptSite(iface);
513 FIXME("(%p)\n", This);
515 return E_NOTIMPL;
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);
557 return E_NOTIMPL;
560 static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL enable)
562 ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface);
564 FIXME("(%p, %d)\n", This, enable);
566 return E_NOTIMPL;
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);
603 return E_NOTIMPL;
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)
616 return;
618 if (host->script) {
619 IActiveScript_Close(host->script);
620 IActiveScript_Release(host->script);
623 if (host->parse)
624 IActiveScriptParse_Release(host->parse);
626 host->parse = NULL;
627 host->script = NULL;
630 static void detach_module(ScriptModule *module)
632 ScriptHost *host = module->host;
634 if (host) {
635 module->host = NULL;
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;
650 else
652 WARN("unsupported interface: (%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
653 *ppv = NULL;
654 return E_NOINTERFACE;
657 IUnknown_AddRef((IUnknown*)*ppv);
658 return S_OK;
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);
668 return 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);
678 if (!ref)
680 detach_module(This);
681 SysFreeString(This->name);
682 if (This->script_dispatch)
683 IDispatch_Release(This->script_dispatch);
684 heap_free(This);
687 return ref;
690 static HRESULT WINAPI ScriptModule_GetTypeInfoCount(IScriptModule *iface, UINT *pctinfo)
692 ScriptModule *This = impl_from_IScriptModule(iface);
694 TRACE("(%p)->(%p)\n", This, pctinfo);
696 *pctinfo = 1;
697 return S_OK;
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);
714 ITypeInfo *typeinfo;
715 HRESULT hr;
717 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
719 hr = get_typeinfo(IScriptModule_tid, &typeinfo);
720 if (SUCCEEDED(hr))
722 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
723 ITypeInfo_Release(typeinfo);
726 return hr;
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);
734 ITypeInfo *typeinfo;
735 HRESULT hr;
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);
741 if(SUCCEEDED(hr))
743 hr = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags,
744 pDispParams, pVarResult, pExcepInfo, puArgErr);
745 ITypeInfo_Release(typeinfo);
748 return hr;
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);
770 return E_NOTIMPL;
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);
779 return E_NOTIMPL;
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));
788 if (!This->host)
789 return E_FAIL;
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);
800 if (!res)
801 return E_POINTER;
802 V_VT(res) = VT_EMPTY;
803 if (!This->host)
804 return E_FAIL;
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));
815 if (!This->host)
816 return E_FAIL;
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);
827 return E_NOTIMPL;
830 static const IScriptModuleVtbl ScriptModuleVtbl = {
831 ScriptModule_QueryInterface,
832 ScriptModule_AddRef,
833 ScriptModule_Release,
834 ScriptModule_GetTypeInfoCount,
835 ScriptModule_GetTypeInfo,
836 ScriptModule_GetIDsOfNames,
837 ScriptModule_Invoke,
838 ScriptModule_get_Name,
839 ScriptModule_get_CodeObject,
840 ScriptModule_get_Procedures,
841 ScriptModule_AddCode,
842 ScriptModule_Eval,
843 ScriptModule_ExecuteStatement,
844 ScriptModule_Run
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;
854 module->ref = 1;
855 module->name = NULL;
856 if (name && !(module->name = SysAllocString(name)))
858 heap_free(module);
859 return NULL;
861 module->host = host;
862 module->script_dispatch = NULL;
863 IActiveScriptSite_AddRef(&host->IActiveScriptSite_iface);
864 return module;
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)
881 unsigned int i;
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];
891 return NULL;
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;
903 else
905 WARN("unsupported interface: (%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
906 *ppv = NULL;
907 return E_NOINTERFACE;
910 IUnknown_AddRef((IUnknown*)*ppv);
911 return S_OK;
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);
932 *pctinfo = 1;
933 return S_OK;
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);
950 ITypeInfo *typeinfo;
951 HRESULT hr;
953 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
955 hr = get_typeinfo(IScriptModuleCollection_tid, &typeinfo);
956 if (SUCCEEDED(hr))
958 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
959 ITypeInfo_Release(typeinfo);
962 return hr;
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);
970 ITypeInfo *typeinfo;
971 HRESULT hr;
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);
977 if(SUCCEEDED(hr))
979 hr = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags,
980 pDispParams, pVarResult, pExcepInfo, puArgErr);
981 ITypeInfo_Release(typeinfo);
984 return hr;
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);
993 return E_NOTIMPL;
996 static HRESULT WINAPI ScriptModuleCollection_get_Item(IScriptModuleCollection *iface, VARIANT index,
997 IScriptModule **ppmod)
999 ScriptControl *This = impl_from_IScriptModuleCollection(iface);
1000 ScriptModule *module;
1001 unsigned int i;
1002 HRESULT hr;
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;
1014 else
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);
1027 return S_OK;
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;
1040 return S_OK;
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;
1049 HRESULT hr;
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);
1072 else
1073 hr = IActiveScript_AddNamedItem(host->script, name, SCRIPTITEM_CODEONLY);
1075 if (FAILED(hr))
1077 IScriptModule_Release(&module->IScriptModule_iface);
1078 return hr;
1080 This->modules[host->module_count++] = module;
1082 *ppmod = &module->IScriptModule_iface;
1083 IScriptModule_AddRef(*ppmod);
1084 return S_OK;
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;
1104 ScriptHost *host;
1105 HRESULT hr;
1107 *ret = NULL;
1109 host = heap_alloc(sizeof(*host));
1110 if (!host)
1111 return E_OUTOFMEMORY;
1113 host->IActiveScriptSite_iface.lpVtbl = &ActiveScriptSiteVtbl;
1114 host->IActiveScriptSiteWindow_iface.lpVtbl = &ActiveScriptSiteWindowVtbl;
1115 host->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
1116 host->ref = 1;
1117 host->script = NULL;
1118 host->parse = 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);
1125 if (FAILED(hr)) {
1126 WARN("Failed to create an instance for %s, %#x\n", debugstr_guid(clsid), hr);
1127 goto failed;
1130 hr = IActiveScript_QueryInterface(host->script, &IID_IObjectSafety, (void**)&objsafety);
1131 if (FAILED(hr)) {
1132 FIXME("Could not get IObjectSafety, %#x\n", hr);
1133 goto failed;
1136 hr = IObjectSafety_SetInterfaceSafetyOptions(objsafety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA, 0);
1137 IObjectSafety_Release(objsafety);
1138 if (FAILED(hr)) {
1139 FIXME("SetInterfaceSafetyOptions failed, %#x\n", hr);
1140 goto failed;
1143 hr = IActiveScript_SetScriptSite(host->script, &host->IActiveScriptSite_iface);
1144 if (FAILED(hr)) {
1145 WARN("SetScriptSite failed, %#x\n", hr);
1146 goto failed;
1149 hr = IActiveScript_QueryInterface(host->script, &IID_IActiveScriptParse, (void**)&host->parse);
1150 if (FAILED(hr)) {
1151 WARN("Failed to get IActiveScriptParse, %#x\n", hr);
1152 goto failed;
1155 hr = IActiveScriptParse_InitNew(host->parse);
1156 if (FAILED(hr)) {
1157 WARN("InitNew failed, %#x\n", hr);
1158 goto failed;
1160 host->script_state = SCRIPTSTATE_INITIALIZED;
1162 *ret = host;
1163 return S_OK;
1165 failed:
1166 detach_script_host(host);
1167 return hr;
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;
1213 }else {
1214 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
1215 *ppv = NULL;
1216 return E_NOINTERFACE;
1219 IUnknown_AddRef((IUnknown*)*ppv);
1220 return S_OK;
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);
1230 return 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);
1240 if(!ref) {
1241 if (This->site)
1242 IOleClientSite_Release(This->site);
1243 if (This->host)
1245 release_modules(This, FALSE);
1246 IActiveScriptSite_Release(&This->host->IActiveScriptSite_iface);
1248 heap_free(This);
1251 return ref;
1254 static HRESULT WINAPI ScriptControl_GetTypeInfoCount(IScriptControl *iface, UINT *pctinfo)
1256 ScriptControl *This = impl_from_IScriptControl(iface);
1257 TRACE("(%p)->(%p)\n", This, pctinfo);
1258 *pctinfo = 1;
1259 return S_OK;
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;
1275 HRESULT hres;
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);
1285 return hres;
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;
1294 HRESULT hres;
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);
1306 return hres;
1309 static HRESULT WINAPI ScriptControl_get_Language(IScriptControl *iface, BSTR *p)
1311 ScriptControl *This = impl_from_IScriptControl(iface);
1312 LPOLESTR progidW;
1313 HRESULT hr;
1315 TRACE("(%p)->(%p)\n", This, p);
1317 if (!p)
1318 return E_POINTER;
1320 *p = NULL;
1322 if (!This->host)
1323 return S_OK;
1325 hr = ProgIDFromCLSID(&This->host->clsid, &progidW);
1326 if (FAILED(hr))
1327 return hr;
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);
1337 CLSID clsid;
1338 HRESULT hres;
1340 TRACE("(%p)->(%s)\n", This, debugstr_w(language));
1342 if (language && FAILED(CLSIDFromProgID(language, &clsid)))
1343 return CTL_E_INVALIDPROPERTYVALUE;
1345 if (This->host) {
1346 release_modules(This, TRUE);
1347 IActiveScriptSite_Release(&This->host->IActiveScriptSite_iface);
1348 This->host = NULL;
1351 if (!language)
1352 return S_OK;
1354 hres = init_script_host(&clsid, &This->host);
1355 if (FAILED(hres))
1356 return hres;
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;
1368 else
1369 hres = E_OUTOFMEMORY;
1371 if (FAILED(hres)) {
1372 detach_script_host(This->host);
1373 This->host = NULL;
1375 return hres;
1378 static HRESULT WINAPI ScriptControl_get_State(IScriptControl *iface, ScriptControlStates *p)
1380 ScriptControl *This = impl_from_IScriptControl(iface);
1381 SCRIPTSTATE state;
1382 HRESULT hres;
1384 TRACE("(%p)->(%p)\n", This, p);
1386 if(!p)
1387 return E_POINTER;
1389 if(!This->host)
1390 return E_FAIL;
1392 hres = IActiveScript_GetScriptState(This->host->script, &state);
1393 if (FAILED(hres)) return hres;
1395 switch (state)
1397 case SCRIPTSTATE_INITIALIZED:
1398 case SCRIPTSTATE_STARTED:
1399 *p = Initialized;
1400 break;
1401 case SCRIPTSTATE_CONNECTED:
1402 *p = Connected;
1403 break;
1404 default:
1405 WARN("unexpected state %d\n", state);
1406 return E_FAIL;
1408 return S_OK;
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);
1416 if(!This->host)
1417 return E_FAIL;
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);
1431 return S_OK;
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);
1438 return E_NOTIMPL;
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);
1447 if (!p)
1448 return E_POINTER;
1450 *p = This->timeout;
1451 return S_OK;
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);
1460 if (timeout < -1)
1461 return CTL_E_INVALIDPROPERTYVALUE;
1463 if (timeout != -1)
1464 FIXME("execution timeout ignored\n");
1466 This->timeout = timeout;
1467 return S_OK;
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);
1475 if(!p)
1476 return E_POINTER;
1478 *p = This->allow_ui;
1479 return S_OK;
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;
1488 return S_OK;
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);
1496 if(!p)
1497 return E_POINTER;
1499 *p = This->use_safe_subset;
1500 return S_OK;
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;
1509 return S_OK;
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);
1522 return S_OK;
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);
1529 return E_NOTIMPL;
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);
1536 return E_NOTIMPL;
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);
1543 return E_NOTIMPL;
1546 static HRESULT WINAPI ScriptControl__AboutBox(IScriptControl *iface)
1548 ScriptControl *This = impl_from_IScriptControl(iface);
1549 FIXME("(%p)\n", This);
1550 return E_NOTIMPL;
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);
1560 if (!object)
1561 return E_INVALIDARG;
1563 if (!This->host)
1564 return E_FAIL;
1566 if (add_members)
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);
1577 if (!This->host)
1578 return E_FAIL;
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));
1590 if (!This->host)
1591 return E_FAIL;
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);
1602 if (!res)
1603 return E_POINTER;
1604 V_VT(res) = VT_EMPTY;
1605 if (!This->host)
1606 return E_FAIL;
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));
1617 if (!This->host)
1618 return E_FAIL;
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;
1627 IDispatch *disp;
1628 SAFEARRAY *sa;
1629 DISPPARAMS dp;
1630 DISPID dispid;
1631 HRESULT hr;
1632 UINT i;
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;
1656 dp.cNamedArgs = 0;
1657 dp.rgvarg = heap_alloc(dp.cArgs * sizeof(*dp.rgvarg));
1658 if (!dp.rgvarg) return E_OUTOFMEMORY;
1660 hr = SafeArrayLock(sa);
1661 if (SUCCEEDED(hr))
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);
1669 if (FAILED(hr))
1671 hr = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_USER_DEFAULT,
1672 DISPATCH_METHOD, &dp, res, NULL, NULL);
1674 else
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);
1683 return hr;
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,
1714 ScriptControl_Eval,
1715 ScriptControl_ExecuteStatement,
1716 ScriptControl_Run
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);
1743 if (This->site)
1744 IOleClientSite_Release(This->site);
1746 if ((This->site = site))
1747 IOleClientSite_AddRef(site);
1749 return S_OK;
1752 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **site)
1754 ScriptControl *This = impl_from_IOleObject(iface);
1756 TRACE("(%p)->(%p)\n", This, site);
1758 if (!site)
1759 return E_POINTER;
1761 if ((*site = This->site))
1762 IOleClientSite_AddRef(*site);
1764 return S_OK;
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));
1773 return E_NOTIMPL;
1776 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD save)
1778 ScriptControl *This = impl_from_IOleObject(iface);
1780 FIXME("(%p)->(%d)\n", This, save);
1782 return E_NOTIMPL;
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);
1791 return E_NOTIMPL;
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);
1800 return E_NOTIMPL;
1803 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *dataobj, BOOL creation,
1804 DWORD reserved)
1806 ScriptControl *This = impl_from_IOleObject(iface);
1808 FIXME("(%p)->(%p %d %d)\n", This, dataobj, creation, reserved);
1810 return E_NOTIMPL;
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);
1819 return E_NOTIMPL;
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);
1829 return E_NOTIMPL;
1832 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **enumoleverb)
1834 ScriptControl *This = impl_from_IOleObject(iface);
1836 FIXME("(%p)->(%p)\n", This, enumoleverb);
1838 return E_NOTIMPL;
1841 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
1843 ScriptControl *This = impl_from_IOleObject(iface);
1845 FIXME("(%p)\n", This);
1847 return E_NOTIMPL;
1850 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
1852 ScriptControl *This = impl_from_IOleObject(iface);
1854 FIXME("(%p)\n", This);
1856 return E_NOTIMPL;
1859 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *clsid)
1861 ScriptControl *This = impl_from_IOleObject(iface);
1863 FIXME("(%p)->(%p)\n", This, clsid);
1865 return E_NOTIMPL;
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);
1874 return E_NOTIMPL;
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);
1883 return E_NOTIMPL;
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;
1896 return S_OK;
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);
1905 return E_NOTIMPL;
1908 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD connection)
1910 ScriptControl *This = impl_from_IOleObject(iface);
1912 FIXME("(%p)->(%d)\n", This, connection);
1914 return E_NOTIMPL;
1917 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **enumadvise)
1919 ScriptControl *This = impl_from_IOleObject(iface);
1921 FIXME("(%p)->(%p)\n", This, enumadvise);
1923 return E_NOTIMPL;
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);
1941 return E_NOTIMPL;
1944 static const IOleObjectVtbl OleObjectVtbl = {
1945 OleObject_QueryInterface,
1946 OleObject_AddRef,
1947 OleObject_Release,
1948 OleObject_SetClientSite,
1949 OleObject_GetClientSite,
1950 OleObject_SetHostNames,
1951 OleObject_Close,
1952 OleObject_SetMoniker,
1953 OleObject_GetMoniker,
1954 OleObject_InitFromData,
1955 OleObject_GetClipboardData,
1956 OleObject_DoVerb,
1957 OleObject_EnumVerbs,
1958 OleObject_Update,
1959 OleObject_IsUpToDate,
1960 OleObject_GetUserClassID,
1961 OleObject_GetUserType,
1962 OleObject_SetExtent,
1963 OleObject_GetExtent,
1964 OleObject_Advise,
1965 OleObject_Unadvise,
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);
1995 return E_NOTIMPL;
1998 static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface)
2000 ScriptControl *This = impl_from_IPersistStreamInit(iface);
2002 FIXME("(%p)\n", This);
2004 return E_NOTIMPL;
2007 static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream)
2009 ScriptControl *This = impl_from_IPersistStreamInit(iface);
2011 FIXME("(%p)->(%p)\n", This, stream);
2013 return E_NOTIMPL;
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);
2022 return E_NOTIMPL;
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);
2031 return E_NOTIMPL;
2034 static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
2036 ScriptControl *This = impl_from_IPersistStreamInit(iface);
2038 FIXME("(%p)\n", This);
2040 return S_OK;
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);
2079 if (!info)
2080 return E_POINTER;
2082 info->hAccel = NULL;
2083 info->cAccel = 0;
2085 return S_OK;
2088 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg)
2090 ScriptControl *This = impl_from_IOleControl(iface);
2092 FIXME("(%p)->(%p)\n", This, msg);
2094 return E_NOTIMPL;
2097 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispid)
2099 ScriptControl *This = impl_from_IOleControl(iface);
2101 FIXME("(%p)->(%#x)\n", This, dispid);
2103 return E_NOTIMPL;
2106 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze)
2108 ScriptControl *This = impl_from_IOleControl(iface);
2110 FIXME("(%p)->(%d)\n", This, freeze);
2112 return E_NOTIMPL;
2115 static const IOleControlVtbl OleControlVtbl = {
2116 OleControl_QueryInterface,
2117 OleControl_AddRef,
2118 OleControl_Release,
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);
2149 return E_NOTIMPL;
2152 static HRESULT WINAPI QuickActivate_SetContentExtent(IQuickActivate *iface, SIZEL *size)
2154 ScriptControl *This = impl_from_IQuickActivate(iface);
2156 FIXME("(%p)->(%p)\n", This, size);
2158 return E_NOTIMPL;
2161 static HRESULT WINAPI QuickActivate_GetContentExtent(IQuickActivate *iface, SIZEL *size)
2163 ScriptControl *This = impl_from_IQuickActivate(iface);
2165 FIXME("(%p)->(%p)\n", This, size);
2167 return E_NOTIMPL;
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);
2206 return E_NOTIMPL;
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,
2215 colorset);
2217 return E_NOTIMPL;
2220 static HRESULT WINAPI ViewObject_Freeze(IViewObjectEx *iface, DWORD drawaspect, LONG index, void *aspect,
2221 DWORD *freeze)
2223 ScriptControl *This = impl_from_IViewObjectEx(iface);
2225 FIXME("(%p)->(%d %d %p %p)\n", This, drawaspect, index, aspect, freeze);
2227 return E_NOTIMPL;
2230 static HRESULT WINAPI ViewObject_Unfreeze(IViewObjectEx *iface, DWORD freeze)
2232 ScriptControl *This = impl_from_IViewObjectEx(iface);
2234 FIXME("(%p)->(%d)\n", This, freeze);
2236 return E_NOTIMPL;
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);
2255 return S_OK;
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);
2264 if (aspects)
2265 *aspects = DVASPECT_CONTENT;
2266 if (flags)
2267 *flags = This->view_sink_flags;
2268 if (sink) {
2269 *sink = This->view_sink;
2270 if (*sink)
2271 IAdviseSink_AddRef(*sink);
2274 return S_OK;
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);
2284 return E_NOTIMPL;
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);
2293 return E_NOTIMPL;
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;
2303 return S_OK;
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);
2313 return E_NOTIMPL;
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);
2323 return E_NOTIMPL;
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);
2333 return E_NOTIMPL;
2336 static const IViewObjectExVtbl ViewObjectExVtbl = {
2337 ViewObject_QueryInterface,
2338 ViewObject_AddRef,
2339 ViewObject_Release,
2340 ViewObject_Draw,
2341 ViewObject_GetColorSet,
2342 ViewObject_Freeze,
2343 ViewObject_Unfreeze,
2344 ViewObject_SetAdvise,
2345 ViewObject_GetAdvise,
2346 ViewObject_GetExtent,
2347 ViewObject_GetRect,
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);
2378 if (!policy)
2379 return E_POINTER;
2381 *policy = 0;
2382 return S_OK;
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);
2392 return E_NOTIMPL;
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);
2402 return E_NOTIMPL;
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);
2438 return E_NOTIMPL;
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);
2448 *cp = NULL;
2450 for (iter = This->cp_list; iter; iter = iter->next) {
2451 if (IsEqualIID(iter->riid, riid))
2452 *cp = &iter->IConnectionPoint_iface;
2455 if (*cp) {
2456 IConnectionPoint_AddRef(*cp);
2457 return S_OK;
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;
2483 }else {
2484 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
2485 *ppv = NULL;
2486 return E_NOINTERFACE;
2489 IUnknown_AddRef((IUnknown*)*ppv);
2490 return S_OK;
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);
2511 *iid = *This->riid;
2512 return S_OK;
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);
2522 if (!container)
2523 return E_POINTER;
2525 *container = &This->control->IConnectionPointContainer_iface;
2526 IConnectionPointContainer_AddRef(*container);
2528 return S_OK;
2531 static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *unk_sink,
2532 DWORD *cookie)
2534 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
2536 FIXME("(%p)->(%p %p)\n", This, unk_sink, cookie);
2538 return E_NOTIMPL;
2541 static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD cookie)
2543 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
2545 FIXME("(%p)->(%d)\n", This, cookie);
2547 return E_NOTIMPL;
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);
2557 return E_NOTIMPL;
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;
2575 cp->control = sc;
2576 cp->riid = riid;
2578 cp->next = sc->cp_list;
2579 sc->cp_list = cp;
2582 static HRESULT WINAPI ScriptControl_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
2584 ScriptControl *script_control;
2585 DWORD dpi_x, dpi_y;
2586 HRESULT hres;
2587 HDC hdc;
2589 TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
2591 script_control = heap_alloc_zero(sizeof(*script_control));
2592 if(!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);
2612 hdc = GetDC(0);
2613 dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
2614 dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
2615 ReleaseDC(0, hdc);
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);
2622 return hres;
2625 /******************************************************************
2626 * DllMain (msscript.ocx.@)
2628 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
2630 TRACE("(%p %d %p)\n", instance, reason, reserved);
2632 switch(reason) {
2633 case DLL_WINE_PREATTACH:
2634 return FALSE; /* prefer native version */
2635 case DLL_PROCESS_ATTACH:
2636 msscript_instance = instance;
2637 DisableThreadLibraryCalls(instance);
2638 break;
2639 case DLL_PROCESS_DETACH:
2640 if(!reserved)
2641 release_typelib();
2642 break;
2645 return TRUE;
2648 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
2650 *ppv = NULL;
2652 if(IsEqualGUID(&IID_IUnknown, riid)) {
2653 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
2654 *ppv = iface;
2655 }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
2656 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
2657 *ppv = iface;
2660 if(*ppv) {
2661 IUnknown_AddRef((IUnknown*)*ppv);
2662 return S_OK;
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);
2672 return 2;
2675 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
2677 TRACE("(%p)\n", iface);
2678 return 1;
2681 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
2683 TRACE("(%p)->(%x)\n", iface, fLock);
2684 return S_OK;
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)
2716 TRACE("\n");
2717 return S_FALSE;
2720 /***********************************************************************
2721 * DllRegisterServer (msscript.ocx.@)
2723 HRESULT WINAPI DllRegisterServer(void)
2725 TRACE("()\n");
2726 return __wine_register_resources(msscript_instance);
2729 /***********************************************************************
2730 * DllUnregisterServer (msscript.ocx.@)
2732 HRESULT WINAPI DllUnregisterServer(void)
2734 TRACE("()\n");
2735 return __wine_unregister_resources(msscript_instance);