msscript: Implement IScriptControl_[get|put]_State.
[wine.git] / dlls / msscript.ocx / msscript.c
blob746c2d3892df1e35edbc0be294e6bcd59ce2c181
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 "ole2.h"
24 #include "olectl.h"
25 #include "objsafe.h"
26 #include "activscp.h"
27 #include "rpcproxy.h"
28 #include "msscript.h"
30 #include "wine/debug.h"
31 #include "wine/heap.h"
32 #include "wine/list.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(msscript);
36 #ifdef _WIN64
38 #define IActiveScriptParse_Release IActiveScriptParse64_Release
39 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
40 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
42 #else
44 #define IActiveScriptParse_Release IActiveScriptParse32_Release
45 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
46 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
48 #endif
50 struct ScriptControl;
51 typedef struct ConnectionPoint ConnectionPoint;
53 struct ConnectionPoint {
54 IConnectionPoint IConnectionPoint_iface;
55 ScriptControl *control;
56 const IID *riid;
57 ConnectionPoint *next;
60 struct named_item {
61 struct list entry;
62 BSTR name;
63 IDispatch *disp;
66 typedef struct ScriptHost {
67 IActiveScriptSite IActiveScriptSite_iface;
68 IActiveScriptSiteWindow IActiveScriptSiteWindow_iface;
69 IServiceProvider IServiceProvider_iface;
70 LONG ref;
72 IActiveScript *script;
73 IActiveScriptParse *parse;
74 CLSID clsid;
76 struct list named_items;
77 } ScriptHost;
79 struct ScriptControl {
80 IScriptControl IScriptControl_iface;
81 IPersistStreamInit IPersistStreamInit_iface;
82 IOleObject IOleObject_iface;
83 IOleControl IOleControl_iface;
84 IQuickActivate IQuickActivate_iface;
85 IViewObjectEx IViewObjectEx_iface;
86 IPointerInactive IPointerInactive_iface;
87 IConnectionPointContainer IConnectionPointContainer_iface;
88 LONG ref;
89 IOleClientSite *site;
90 SIZEL extent;
91 LONG timeout;
92 VARIANT_BOOL allow_ui;
93 VARIANT_BOOL use_safe_subset;
94 ScriptControlStates state;
96 /* connection points */
97 ConnectionPoint *cp_list;
98 ConnectionPoint cp_scsource;
99 ConnectionPoint cp_propnotif;
101 /* IViewObject sink */
102 IAdviseSink *view_sink;
103 DWORD view_sink_flags;
105 ScriptHost *host;
108 static HINSTANCE msscript_instance;
110 typedef enum tid_t {
111 IScriptControl_tid,
112 LAST_tid
113 } tid_t;
115 static ITypeLib *typelib;
116 static ITypeInfo *typeinfos[LAST_tid];
118 static REFIID tid_ids[] = {
119 &IID_IScriptControl
122 static HRESULT load_typelib(void)
124 HRESULT hres;
125 ITypeLib *tl;
127 hres = LoadRegTypeLib(&LIBID_MSScriptControl, 1, 0, LOCALE_SYSTEM_DEFAULT, &tl);
128 if(FAILED(hres)) {
129 ERR("LoadRegTypeLib failed: %08x\n", hres);
130 return hres;
133 if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
134 ITypeLib_Release(tl);
135 return hres;
138 static HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
140 HRESULT hres;
142 if (!typelib)
143 hres = load_typelib();
144 if (!typelib)
145 return hres;
147 if(!typeinfos[tid]) {
148 ITypeInfo *ti;
150 hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
151 if(FAILED(hres)) {
152 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres);
153 return hres;
156 if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL))
157 ITypeInfo_Release(ti);
160 *typeinfo = typeinfos[tid];
161 ITypeInfo_AddRef(typeinfos[tid]);
162 return S_OK;
165 static void release_typelib(void)
167 unsigned i;
169 if(!typelib)
170 return;
172 for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
173 if(typeinfos[i])
174 ITypeInfo_Release(typeinfos[i]);
176 ITypeLib_Release(typelib);
179 static void clear_named_items(ScriptHost *host)
181 struct named_item *item, *item1;
182 LIST_FOR_EACH_ENTRY_SAFE(item, item1, &host->named_items, struct named_item, entry) {
183 list_remove(&item->entry);
184 SysFreeString(item->name);
185 IDispatch_Release(item->disp);
186 heap_free(item);
190 static struct named_item *host_get_named_item(ScriptHost *host, const WCHAR *nameW)
192 struct named_item *item;
194 LIST_FOR_EACH_ENTRY(item, &host->named_items, struct named_item, entry) {
195 if (!lstrcmpW(item->name, nameW))
196 return item;
199 return NULL;
202 static inline ScriptControl *impl_from_IScriptControl(IScriptControl *iface)
204 return CONTAINING_RECORD(iface, ScriptControl, IScriptControl_iface);
207 static inline ScriptControl *impl_from_IOleObject(IOleObject *iface)
209 return CONTAINING_RECORD(iface, ScriptControl, IOleObject_iface);
212 static inline ScriptControl *impl_from_IPersistStreamInit(IPersistStreamInit *iface)
214 return CONTAINING_RECORD(iface, ScriptControl, IPersistStreamInit_iface);
217 static inline ScriptControl *impl_from_IOleControl(IOleControl *iface)
219 return CONTAINING_RECORD(iface, ScriptControl, IOleControl_iface);
222 static inline ScriptControl *impl_from_IQuickActivate(IQuickActivate *iface)
224 return CONTAINING_RECORD(iface, ScriptControl, IQuickActivate_iface);
227 static inline ScriptControl *impl_from_IViewObjectEx(IViewObjectEx *iface)
229 return CONTAINING_RECORD(iface, ScriptControl, IViewObjectEx_iface);
232 static inline ScriptControl *impl_from_IPointerInactive(IPointerInactive *iface)
234 return CONTAINING_RECORD(iface, ScriptControl, IPointerInactive_iface);
237 static inline ScriptControl *impl_from_IConnectionPointContainer(IConnectionPointContainer *iface)
239 return CONTAINING_RECORD(iface, ScriptControl, IConnectionPointContainer_iface);
242 static inline ConnectionPoint *impl_from_IConnectionPoint(IConnectionPoint *iface)
244 return CONTAINING_RECORD(iface, ConnectionPoint, IConnectionPoint_iface);
247 static inline ScriptHost *impl_from_IActiveScriptSite(IActiveScriptSite *iface)
249 return CONTAINING_RECORD(iface, ScriptHost, IActiveScriptSite_iface);
252 static inline ScriptHost *impl_from_IActiveScriptSiteWindow(IActiveScriptSiteWindow *iface)
254 return CONTAINING_RECORD(iface, ScriptHost, IActiveScriptSiteWindow_iface);
257 static inline ScriptHost *impl_from_IServiceProvider(IServiceProvider *iface)
259 return CONTAINING_RECORD(iface, ScriptHost, IServiceProvider_iface);
262 /* IActiveScriptSite */
263 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
265 ScriptHost *This = impl_from_IActiveScriptSite(iface);
267 if(IsEqualGUID(&IID_IUnknown, riid)) {
268 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
269 *ppv = &This->IActiveScriptSite_iface;
270 }else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) {
271 TRACE("(%p)->(IID_IActiveScriptSite %p)\n", This, ppv);
272 *ppv = &This->IActiveScriptSite_iface;
273 }else if(IsEqualGUID(&IID_IActiveScriptSiteWindow, riid)) {
274 TRACE("(%p)->(IID_IActiveScriptSiteWindow %p)\n", This, ppv);
275 *ppv = &This->IActiveScriptSiteWindow_iface;
276 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
277 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
278 *ppv = &This->IServiceProvider_iface;
279 }else {
280 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
281 *ppv = NULL;
282 return E_NOINTERFACE;
285 IUnknown_AddRef((IUnknown*)*ppv);
286 return S_OK;
289 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
291 ScriptHost *This = impl_from_IActiveScriptSite(iface);
292 LONG ref = InterlockedIncrement(&This->ref);
294 TRACE("(%p) ref=%d\n", This, ref);
296 return ref;
299 static void release_script_engine(ScriptHost *host)
301 if (host->script) {
302 IActiveScript_Close(host->script);
303 IActiveScript_Release(host->script);
306 if (host->parse)
307 IActiveScriptParse_Release(host->parse);
309 host->parse = NULL;
310 host->script = NULL;
312 IActiveScriptSite_Release(&host->IActiveScriptSite_iface);
315 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
317 ScriptHost *This = impl_from_IActiveScriptSite(iface);
318 LONG ref = InterlockedDecrement(&This->ref);
320 TRACE("(%p) ref=%d\n", This, ref);
322 if(!ref) {
323 clear_named_items(This);
324 heap_free(This);
327 return ref;
330 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *lcid)
332 ScriptHost *This = impl_from_IActiveScriptSite(iface);
334 TRACE("(%p, %p)\n", This, lcid);
336 *lcid = GetUserDefaultLCID();
337 return S_OK;
340 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR name, DWORD mask,
341 IUnknown **unk, ITypeInfo **ti)
343 ScriptHost *This = impl_from_IActiveScriptSite(iface);
344 struct named_item *item;
346 TRACE("(%p, %s, %#x, %p, %p)\n", This, debugstr_w(name), mask, unk, ti);
348 item = host_get_named_item(This, name);
349 if (!item)
350 return TYPE_E_ELEMENTNOTFOUND;
352 if (mask != SCRIPTINFO_IUNKNOWN) {
353 FIXME("mask %#x is not supported\n", mask);
354 return E_NOTIMPL;
357 *unk = (IUnknown*)item->disp;
358 IUnknown_AddRef(*unk);
360 return S_OK;
363 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *version)
365 ScriptHost *This = impl_from_IActiveScriptSite(iface);
367 FIXME("(%p, %p)\n", This, version);
369 return E_NOTIMPL;
372 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, const VARIANT *result,
373 const EXCEPINFO *ei)
375 ScriptHost *This = impl_from_IActiveScriptSite(iface);
377 FIXME("(%p, %s, %p)\n", This, debugstr_variant(result), ei);
379 return E_NOTIMPL;
382 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE state)
384 ScriptHost *This = impl_from_IActiveScriptSite(iface);
386 FIXME("(%p, %d)\n", This, state);
388 return E_NOTIMPL;
391 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *script_error)
393 ScriptHost *This = impl_from_IActiveScriptSite(iface);
395 FIXME("(%p, %p)\n", This, script_error);
397 return E_NOTIMPL;
400 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
402 ScriptHost *This = impl_from_IActiveScriptSite(iface);
404 FIXME("(%p)\n", This);
406 return E_NOTIMPL;
409 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
411 ScriptHost *This = impl_from_IActiveScriptSite(iface);
413 FIXME("(%p)\n", This);
415 return E_NOTIMPL;
418 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
419 ActiveScriptSite_QueryInterface,
420 ActiveScriptSite_AddRef,
421 ActiveScriptSite_Release,
422 ActiveScriptSite_GetLCID,
423 ActiveScriptSite_GetItemInfo,
424 ActiveScriptSite_GetDocVersionString,
425 ActiveScriptSite_OnScriptTerminate,
426 ActiveScriptSite_OnStateChange,
427 ActiveScriptSite_OnScriptError,
428 ActiveScriptSite_OnEnterScript,
429 ActiveScriptSite_OnLeaveScript
432 /* IActiveScriptSiteWindow */
433 static HRESULT WINAPI ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow *iface, REFIID riid, void **obj)
435 ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface);
436 return IActiveScriptSite_QueryInterface(&This->IActiveScriptSite_iface, riid, obj);
439 static ULONG WINAPI ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow *iface)
441 ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface);
442 return IActiveScriptSite_AddRef(&This->IActiveScriptSite_iface);
445 static ULONG WINAPI ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow *iface)
447 ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface);
448 return IActiveScriptSite_Release(&This->IActiveScriptSite_iface);
451 static HRESULT WINAPI ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow *iface, HWND *hwnd)
453 ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface);
455 FIXME("(%p, %p)\n", This, hwnd);
457 return E_NOTIMPL;
460 static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL enable)
462 ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface);
464 FIXME("(%p, %d)\n", This, enable);
466 return E_NOTIMPL;
469 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = {
470 ActiveScriptSiteWindow_QueryInterface,
471 ActiveScriptSiteWindow_AddRef,
472 ActiveScriptSiteWindow_Release,
473 ActiveScriptSiteWindow_GetWindow,
474 ActiveScriptSiteWindow_EnableModeless
477 /* IServiceProvider */
478 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **obj)
480 ScriptHost *This = impl_from_IServiceProvider(iface);
481 return IActiveScriptSite_QueryInterface(&This->IActiveScriptSite_iface, riid, obj);
484 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
486 ScriptHost *This = impl_from_IServiceProvider(iface);
487 return IActiveScriptSite_AddRef(&This->IActiveScriptSite_iface);
490 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
492 ScriptHost *This = impl_from_IServiceProvider(iface);
493 return IActiveScriptSite_Release(&This->IActiveScriptSite_iface);
496 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID service,
497 REFIID riid, void **obj)
499 ScriptHost *This = impl_from_IServiceProvider(iface);
501 FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(service), debugstr_guid(riid), obj);
503 return E_NOTIMPL;
506 static const IServiceProviderVtbl ServiceProviderVtbl = {
507 ServiceProvider_QueryInterface,
508 ServiceProvider_AddRef,
509 ServiceProvider_Release,
510 ServiceProvider_QueryService
513 static HRESULT init_script_host(const CLSID *clsid, ScriptHost **ret)
515 IObjectSafety *objsafety;
516 ScriptHost *host;
517 HRESULT hr;
519 *ret = NULL;
521 host = heap_alloc(sizeof(*host));
522 if (!host)
523 return E_OUTOFMEMORY;
525 host->IActiveScriptSite_iface.lpVtbl = &ActiveScriptSiteVtbl;
526 host->IActiveScriptSiteWindow_iface.lpVtbl = &ActiveScriptSiteWindowVtbl;
527 host->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
528 host->ref = 1;
529 host->script = NULL;
530 host->parse = NULL;
531 host->clsid = *clsid;
532 list_init(&host->named_items);
534 hr = CoCreateInstance(&host->clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
535 &IID_IActiveScript, (void**)&host->script);
536 if (FAILED(hr)) {
537 WARN("Failed to create an instance for %s, %#x\n", debugstr_guid(clsid), hr);
538 goto failed;
541 hr = IActiveScript_QueryInterface(host->script, &IID_IObjectSafety, (void**)&objsafety);
542 if (FAILED(hr)) {
543 FIXME("Could not get IObjectSafety, %#x\n", hr);
544 goto failed;
547 hr = IObjectSafety_SetInterfaceSafetyOptions(objsafety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA, 0);
548 IObjectSafety_Release(objsafety);
549 if (FAILED(hr)) {
550 FIXME("SetInterfaceSafetyOptions failed, %#x\n", hr);
551 goto failed;
554 hr = IActiveScript_SetScriptSite(host->script, &host->IActiveScriptSite_iface);
555 if (FAILED(hr)) {
556 WARN("SetScriptSite failed, %#x\n", hr);
557 goto failed;
560 hr = IActiveScript_QueryInterface(host->script, &IID_IActiveScriptParse, (void**)&host->parse);
561 if (FAILED(hr)) {
562 WARN("Failed to get IActiveScriptParse, %#x\n", hr);
563 goto failed;
566 hr = IActiveScriptParse_InitNew(host->parse);
567 if (FAILED(hr)) {
568 WARN("InitNew failed, %#x\n", hr);
569 goto failed;
572 *ret = host;
573 return S_OK;
575 failed:
576 release_script_engine(host);
577 return hr;
580 static HRESULT WINAPI ScriptControl_QueryInterface(IScriptControl *iface, REFIID riid, void **ppv)
582 ScriptControl *This = impl_from_IScriptControl(iface);
584 if(IsEqualGUID(&IID_IUnknown, riid)) {
585 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
586 *ppv = &This->IScriptControl_iface;
587 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
588 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
589 *ppv = &This->IScriptControl_iface;
590 }else if(IsEqualGUID(&IID_IScriptControl, riid)) {
591 TRACE("(%p)->(IID_IScriptControl %p)\n", This, ppv);
592 *ppv = &This->IScriptControl_iface;
593 }else if(IsEqualGUID(&IID_IOleObject, riid)) {
594 TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv);
595 *ppv = &This->IOleObject_iface;
596 }else if(IsEqualGUID(&IID_IPersistStreamInit, riid)) {
597 TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
598 *ppv = &This->IPersistStreamInit_iface;
599 }else if(IsEqualGUID(&IID_IPersist, riid)) {
600 TRACE("(%p)->(IID_IPersist %p)\n", This, ppv);
601 *ppv = &This->IPersistStreamInit_iface;
602 }else if(IsEqualGUID(&IID_IOleControl, riid)) {
603 TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv);
604 *ppv = &This->IOleControl_iface;
605 }else if(IsEqualGUID(&IID_IQuickActivate, riid)) {
606 TRACE("(%p)->(IID_IQuickActivate %p)\n", This, ppv);
607 *ppv = &This->IQuickActivate_iface;
608 }else if(IsEqualGUID(&IID_IViewObject, riid)) {
609 TRACE("(%p)->(IID_IViewObject %p)\n", This, ppv);
610 *ppv = &This->IViewObjectEx_iface;
611 }else if(IsEqualGUID(&IID_IViewObject2, riid)) {
612 TRACE("(%p)->(IID_IViewObject2 %p)\n", This, ppv);
613 *ppv = &This->IViewObjectEx_iface;
614 }else if(IsEqualGUID(&IID_IViewObjectEx, riid)) {
615 TRACE("(%p)->(IID_IViewObjectEx %p)\n", This, ppv);
616 *ppv = &This->IViewObjectEx_iface;
617 }else if(IsEqualGUID(&IID_IPointerInactive, riid)) {
618 TRACE("(%p)->(IID_IPointerInactive %p)\n", This, ppv);
619 *ppv = &This->IPointerInactive_iface;
620 }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) {
621 TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
622 *ppv = &This->IConnectionPointContainer_iface;
623 }else {
624 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
625 *ppv = NULL;
626 return E_NOINTERFACE;
629 IUnknown_AddRef((IUnknown*)*ppv);
630 return S_OK;
633 static ULONG WINAPI ScriptControl_AddRef(IScriptControl *iface)
635 ScriptControl *This = impl_from_IScriptControl(iface);
636 LONG ref = InterlockedIncrement(&This->ref);
638 TRACE("(%p) ref=%d\n", This, ref);
640 return ref;
643 static ULONG WINAPI ScriptControl_Release(IScriptControl *iface)
645 ScriptControl *This = impl_from_IScriptControl(iface);
646 LONG ref = InterlockedDecrement(&This->ref);
648 TRACE("(%p) ref=%d\n", This, ref);
650 if(!ref) {
651 if (This->site)
652 IOleClientSite_Release(This->site);
653 if (This->host)
654 release_script_engine(This->host);
655 heap_free(This);
658 return ref;
661 static HRESULT WINAPI ScriptControl_GetTypeInfoCount(IScriptControl *iface, UINT *pctinfo)
663 ScriptControl *This = impl_from_IScriptControl(iface);
664 TRACE("(%p)->(%p)\n", This, pctinfo);
665 *pctinfo = 1;
666 return S_OK;
669 static HRESULT WINAPI ScriptControl_GetTypeInfo(IScriptControl *iface, UINT iTInfo,
670 LCID lcid, ITypeInfo **ppTInfo)
672 ScriptControl *This = impl_from_IScriptControl(iface);
673 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
674 return get_typeinfo(IScriptControl_tid, ppTInfo);
677 static HRESULT WINAPI ScriptControl_GetIDsOfNames(IScriptControl *iface, REFIID riid,
678 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
680 ScriptControl *This = impl_from_IScriptControl(iface);
681 ITypeInfo *typeinfo;
682 HRESULT hres;
684 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
686 hres = get_typeinfo(IScriptControl_tid, &typeinfo);
687 if(SUCCEEDED(hres)) {
688 hres = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
689 ITypeInfo_Release(typeinfo);
692 return hres;
695 static HRESULT WINAPI ScriptControl_Invoke(IScriptControl *iface, DISPID dispIdMember,
696 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
697 EXCEPINFO *pExcepInfo, UINT *puArgErr)
699 ScriptControl *This = impl_from_IScriptControl(iface);
700 ITypeInfo *typeinfo;
701 HRESULT hres;
703 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
704 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
706 hres = get_typeinfo(IScriptControl_tid, &typeinfo);
707 if(SUCCEEDED(hres)) {
708 hres = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags,
709 pDispParams, pVarResult, pExcepInfo, puArgErr);
710 ITypeInfo_Release(typeinfo);
713 return hres;
716 static HRESULT WINAPI ScriptControl_get_Language(IScriptControl *iface, BSTR *p)
718 ScriptControl *This = impl_from_IScriptControl(iface);
719 LPOLESTR progidW;
720 HRESULT hr;
722 TRACE("(%p)->(%p)\n", This, p);
724 if (!p)
725 return E_POINTER;
727 *p = NULL;
729 if (!This->host)
730 return S_OK;
732 hr = ProgIDFromCLSID(&This->host->clsid, &progidW);
733 if (FAILED(hr))
734 return hr;
736 *p = SysAllocString(progidW);
737 CoTaskMemFree(progidW);
738 return *p ? S_OK : E_OUTOFMEMORY;
741 static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR language)
743 ScriptControl *This = impl_from_IScriptControl(iface);
744 CLSID clsid;
746 TRACE("(%p)->(%s)\n", This, debugstr_w(language));
748 if (language && FAILED(CLSIDFromProgID(language, &clsid)))
749 return CTL_E_INVALIDPROPERTYVALUE;
751 if (This->host) {
752 release_script_engine(This->host);
753 This->host = NULL;
756 if (!language)
757 return S_OK;
759 return init_script_host(&clsid, &This->host);
762 static HRESULT WINAPI ScriptControl_get_State(IScriptControl *iface, ScriptControlStates *p)
764 ScriptControl *This = impl_from_IScriptControl(iface);
765 TRACE("(%p)->(%p)\n", This, p);
767 if(!p)
768 return E_POINTER;
770 if(!This->host)
771 return E_FAIL;
773 *p = This->state;
774 return S_OK;
777 static HRESULT WINAPI ScriptControl_put_State(IScriptControl *iface, ScriptControlStates state)
779 ScriptControl *This = impl_from_IScriptControl(iface);
780 TRACE("(%p)->(%x)\n", This, state);
782 if(!This->host)
783 return E_FAIL;
785 if(state != Initialized && state != Connected)
786 return CTL_E_INVALIDPROPERTYVALUE;
788 This->state = state;
789 return S_OK;
792 static HRESULT WINAPI ScriptControl_put_SitehWnd(IScriptControl *iface, LONG hwnd)
794 ScriptControl *This = impl_from_IScriptControl(iface);
795 FIXME("(%p)->(%x)\n", This, hwnd);
796 return E_NOTIMPL;
799 static HRESULT WINAPI ScriptControl_get_SitehWnd(IScriptControl *iface, LONG *p)
801 ScriptControl *This = impl_from_IScriptControl(iface);
802 FIXME("(%p)->(%p)\n", This, p);
803 return E_NOTIMPL;
806 static HRESULT WINAPI ScriptControl_get_Timeout(IScriptControl *iface, LONG *p)
808 ScriptControl *This = impl_from_IScriptControl(iface);
810 TRACE("(%p)->(%p)\n", This, p);
812 if (!p)
813 return E_POINTER;
815 *p = This->timeout;
816 return S_OK;
819 static HRESULT WINAPI ScriptControl_put_Timeout(IScriptControl *iface, LONG timeout)
821 ScriptControl *This = impl_from_IScriptControl(iface);
823 TRACE("(%p)->(%d)\n", This, timeout);
825 if (timeout < -1)
826 return CTL_E_INVALIDPROPERTYVALUE;
828 if (timeout != -1)
829 FIXME("execution timeout ignored\n");
831 This->timeout = timeout;
832 return S_OK;
835 static HRESULT WINAPI ScriptControl_get_AllowUI(IScriptControl *iface, VARIANT_BOOL *p)
837 ScriptControl *This = impl_from_IScriptControl(iface);
838 TRACE("(%p)->(%p)\n", This, p);
840 if(!p)
841 return E_POINTER;
843 *p = This->allow_ui;
844 return S_OK;
847 static HRESULT WINAPI ScriptControl_put_AllowUI(IScriptControl *iface, VARIANT_BOOL allow_ui)
849 ScriptControl *This = impl_from_IScriptControl(iface);
850 TRACE("(%p)->(%x)\n", This, allow_ui);
852 This->allow_ui = allow_ui;
853 return S_OK;
856 static HRESULT WINAPI ScriptControl_get_UseSafeSubset(IScriptControl *iface, VARIANT_BOOL *p)
858 ScriptControl *This = impl_from_IScriptControl(iface);
859 TRACE("(%p)->(%p)\n", This, p);
861 if(!p)
862 return E_POINTER;
864 *p = This->use_safe_subset;
865 return S_OK;
868 static HRESULT WINAPI ScriptControl_put_UseSafeSubset(IScriptControl *iface, VARIANT_BOOL use_safe_subset)
870 ScriptControl *This = impl_from_IScriptControl(iface);
871 TRACE("(%p)->(%x)\n", This, use_safe_subset);
873 This->use_safe_subset = use_safe_subset;
874 return S_OK;
877 static HRESULT WINAPI ScriptControl_get_Modules(IScriptControl *iface, IScriptModuleCollection **p)
879 ScriptControl *This = impl_from_IScriptControl(iface);
880 FIXME("(%p)->(%p)\n", This, p);
881 return E_NOTIMPL;
884 static HRESULT WINAPI ScriptControl_get_Error(IScriptControl *iface, IScriptError **p)
886 ScriptControl *This = impl_from_IScriptControl(iface);
887 FIXME("(%p)->(%p)\n", This, p);
888 return E_NOTIMPL;
891 static HRESULT WINAPI ScriptControl_get_CodeObject(IScriptControl *iface, IDispatch **p)
893 ScriptControl *This = impl_from_IScriptControl(iface);
894 FIXME("(%p)->(%p)\n", This, p);
895 return E_NOTIMPL;
898 static HRESULT WINAPI ScriptControl_get_Procedures(IScriptControl *iface, IScriptProcedureCollection **p)
900 ScriptControl *This = impl_from_IScriptControl(iface);
901 FIXME("(%p)->(%p)\n", This, p);
902 return E_NOTIMPL;
905 static HRESULT WINAPI ScriptControl__AboutBox(IScriptControl *iface)
907 ScriptControl *This = impl_from_IScriptControl(iface);
908 FIXME("(%p)\n", This);
909 return E_NOTIMPL;
912 static HRESULT WINAPI ScriptControl_AddObject(IScriptControl *iface, BSTR name, IDispatch *object, VARIANT_BOOL add_members)
914 ScriptControl *This = impl_from_IScriptControl(iface);
915 DWORD flags = SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE;
916 struct named_item *item;
917 HRESULT hr;
919 TRACE("(%p)->(%s %p %x)\n", This, debugstr_w(name), object, add_members);
921 if (!object)
922 return E_INVALIDARG;
924 if (!This->host)
925 return E_FAIL;
927 if (host_get_named_item(This->host, name))
928 return E_INVALIDARG;
930 item = heap_alloc(sizeof(*item));
931 if (!item)
932 return E_OUTOFMEMORY;
934 item->name = SysAllocString(name);
935 IDispatch_AddRef(item->disp = object);
936 list_add_tail(&This->host->named_items, &item->entry);
938 if (add_members)
939 flags |= SCRIPTITEM_GLOBALMEMBERS;
940 hr = IActiveScript_AddNamedItem(This->host->script, name, flags);
941 if (FAILED(hr)) {
942 list_remove(&item->entry);
943 IDispatch_Release(item->disp);
944 SysFreeString(item->name);
945 heap_free(item);
946 return hr;
950 return hr;
953 static HRESULT WINAPI ScriptControl_Reset(IScriptControl *iface)
955 ScriptControl *This = impl_from_IScriptControl(iface);
957 TRACE("(%p)\n", This);
959 if (!This->host)
960 return E_FAIL;
962 clear_named_items(This->host);
963 return IActiveScript_SetScriptState(This->host->script, SCRIPTSTATE_INITIALIZED);
966 static HRESULT WINAPI ScriptControl_AddCode(IScriptControl *iface, BSTR code)
968 ScriptControl *This = impl_from_IScriptControl(iface);
969 FIXME("(%p)->(%s)\n", This, debugstr_w(code));
970 return E_NOTIMPL;
973 static HRESULT WINAPI ScriptControl_Eval(IScriptControl *iface, BSTR expression, VARIANT *res)
975 ScriptControl *This = impl_from_IScriptControl(iface);
976 FIXME("(%p)->(%s %p)\n", This, debugstr_w(expression), res);
977 return E_NOTIMPL;
980 static HRESULT WINAPI ScriptControl_ExecuteStatement(IScriptControl *iface, BSTR statement)
982 ScriptControl *This = impl_from_IScriptControl(iface);
983 FIXME("(%p)->(%s)\n", This, debugstr_w(statement));
984 return E_NOTIMPL;
987 static HRESULT WINAPI ScriptControl_Run(IScriptControl *iface, BSTR procedure_name, SAFEARRAY **parameters, VARIANT *res)
989 ScriptControl *This = impl_from_IScriptControl(iface);
990 FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(procedure_name), parameters, res);
991 return E_NOTIMPL;
994 static const IScriptControlVtbl ScriptControlVtbl = {
995 ScriptControl_QueryInterface,
996 ScriptControl_AddRef,
997 ScriptControl_Release,
998 ScriptControl_GetTypeInfoCount,
999 ScriptControl_GetTypeInfo,
1000 ScriptControl_GetIDsOfNames,
1001 ScriptControl_Invoke,
1002 ScriptControl_get_Language,
1003 ScriptControl_put_Language,
1004 ScriptControl_get_State,
1005 ScriptControl_put_State,
1006 ScriptControl_put_SitehWnd,
1007 ScriptControl_get_SitehWnd,
1008 ScriptControl_get_Timeout,
1009 ScriptControl_put_Timeout,
1010 ScriptControl_get_AllowUI,
1011 ScriptControl_put_AllowUI,
1012 ScriptControl_get_UseSafeSubset,
1013 ScriptControl_put_UseSafeSubset,
1014 ScriptControl_get_Modules,
1015 ScriptControl_get_Error,
1016 ScriptControl_get_CodeObject,
1017 ScriptControl_get_Procedures,
1018 ScriptControl__AboutBox,
1019 ScriptControl_AddObject,
1020 ScriptControl_Reset,
1021 ScriptControl_AddCode,
1022 ScriptControl_Eval,
1023 ScriptControl_ExecuteStatement,
1024 ScriptControl_Run
1027 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **obj)
1029 ScriptControl *This = impl_from_IOleObject(iface);
1030 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
1033 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
1035 ScriptControl *This = impl_from_IOleObject(iface);
1036 return IScriptControl_AddRef(&This->IScriptControl_iface);
1039 static ULONG WINAPI OleObject_Release(IOleObject *iface)
1041 ScriptControl *This = impl_from_IOleObject(iface);
1042 return IScriptControl_Release(&This->IScriptControl_iface);
1045 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *site)
1047 ScriptControl *This = impl_from_IOleObject(iface);
1049 TRACE("(%p)->(%p)\n", This, site);
1051 if (This->site)
1052 IOleClientSite_Release(This->site);
1054 if ((This->site = site))
1055 IOleClientSite_AddRef(site);
1057 return S_OK;
1060 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **site)
1062 ScriptControl *This = impl_from_IOleObject(iface);
1064 TRACE("(%p)->(%p)\n", This, site);
1066 if (!site)
1067 return E_POINTER;
1069 if ((*site = This->site))
1070 IOleClientSite_AddRef(*site);
1072 return S_OK;
1075 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR containerapp, LPCOLESTR containerobj)
1077 ScriptControl *This = impl_from_IOleObject(iface);
1079 FIXME("(%p)->(%s %s)\n", This, debugstr_w(containerapp), debugstr_w(containerobj));
1081 return E_NOTIMPL;
1084 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD save)
1086 ScriptControl *This = impl_from_IOleObject(iface);
1088 FIXME("(%p)->(%d)\n", This, save);
1090 return E_NOTIMPL;
1093 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD which, IMoniker *moniker)
1095 ScriptControl *This = impl_from_IOleObject(iface);
1097 FIXME("(%p)->(%d %p)\n", This, which, moniker);
1099 return E_NOTIMPL;
1102 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD assign, DWORD which, IMoniker **moniker)
1104 ScriptControl *This = impl_from_IOleObject(iface);
1106 FIXME("(%p)->(%d %d %p)\n", This, assign, which, moniker);
1108 return E_NOTIMPL;
1111 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *dataobj, BOOL creation,
1112 DWORD reserved)
1114 ScriptControl *This = impl_from_IOleObject(iface);
1116 FIXME("(%p)->(%p %d %d)\n", This, dataobj, creation, reserved);
1118 return E_NOTIMPL;
1121 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD reserved, IDataObject **dataobj)
1123 ScriptControl *This = impl_from_IOleObject(iface);
1125 FIXME("(%p)->(%d %p)\n", This, reserved, dataobj);
1127 return E_NOTIMPL;
1130 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG verb, LPMSG msg, IOleClientSite *active_site,
1131 LONG index, HWND hwndParent, LPCRECT rect)
1133 ScriptControl *This = impl_from_IOleObject(iface);
1135 FIXME("(%p)->(%d %p %p %d %p %p)\n", This, verb, msg, active_site, index, hwndParent, rect);
1137 return E_NOTIMPL;
1140 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **enumoleverb)
1142 ScriptControl *This = impl_from_IOleObject(iface);
1144 FIXME("(%p)->(%p)\n", This, enumoleverb);
1146 return E_NOTIMPL;
1149 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
1151 ScriptControl *This = impl_from_IOleObject(iface);
1153 FIXME("(%p)\n", This);
1155 return E_NOTIMPL;
1158 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
1160 ScriptControl *This = impl_from_IOleObject(iface);
1162 FIXME("(%p)\n", This);
1164 return E_NOTIMPL;
1167 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *clsid)
1169 ScriptControl *This = impl_from_IOleObject(iface);
1171 FIXME("(%p)->(%p)\n", This, clsid);
1173 return E_NOTIMPL;
1176 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD form_of_type, LPOLESTR *usertype)
1178 ScriptControl *This = impl_from_IOleObject(iface);
1180 FIXME("(%p)->(%d %p)\n", This, form_of_type, usertype);
1182 return E_NOTIMPL;
1185 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD aspect, SIZEL *size)
1187 ScriptControl *This = impl_from_IOleObject(iface);
1189 FIXME("(%p)->(%d %p)\n", This, aspect, size);
1191 return E_NOTIMPL;
1194 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD aspect, SIZEL *size)
1196 ScriptControl *This = impl_from_IOleObject(iface);
1198 TRACE("(%p)->(%d %p)\n", This, aspect, size);
1200 if (aspect != DVASPECT_CONTENT)
1201 return DV_E_DVASPECT;
1203 *size = This->extent;
1204 return S_OK;
1207 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *sink, DWORD *connection)
1209 ScriptControl *This = impl_from_IOleObject(iface);
1211 FIXME("(%p)->(%p %p)\n", This, sink, connection);
1213 return E_NOTIMPL;
1216 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD connection)
1218 ScriptControl *This = impl_from_IOleObject(iface);
1220 FIXME("(%p)->(%d)\n", This, connection);
1222 return E_NOTIMPL;
1225 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **enumadvise)
1227 ScriptControl *This = impl_from_IOleObject(iface);
1229 FIXME("(%p)->(%p)\n", This, enumadvise);
1231 return E_NOTIMPL;
1234 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD aspect, DWORD *status)
1236 ScriptControl *This = impl_from_IOleObject(iface);
1238 TRACE("(%p)->(%d %p)\n", This, aspect, status);
1240 return OleRegGetMiscStatus(&CLSID_ScriptControl, aspect, status);
1243 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *logpal)
1245 ScriptControl *This = impl_from_IOleObject(iface);
1247 FIXME("(%p)->(%p)\n", This, logpal);
1249 return E_NOTIMPL;
1252 static const IOleObjectVtbl OleObjectVtbl = {
1253 OleObject_QueryInterface,
1254 OleObject_AddRef,
1255 OleObject_Release,
1256 OleObject_SetClientSite,
1257 OleObject_GetClientSite,
1258 OleObject_SetHostNames,
1259 OleObject_Close,
1260 OleObject_SetMoniker,
1261 OleObject_GetMoniker,
1262 OleObject_InitFromData,
1263 OleObject_GetClipboardData,
1264 OleObject_DoVerb,
1265 OleObject_EnumVerbs,
1266 OleObject_Update,
1267 OleObject_IsUpToDate,
1268 OleObject_GetUserClassID,
1269 OleObject_GetUserType,
1270 OleObject_SetExtent,
1271 OleObject_GetExtent,
1272 OleObject_Advise,
1273 OleObject_Unadvise,
1274 OleObject_EnumAdvise,
1275 OleObject_GetMiscStatus,
1276 OleObject_SetColorScheme
1279 static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface, REFIID riid, void **obj)
1281 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1282 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
1285 static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface)
1287 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1288 return IScriptControl_AddRef(&This->IScriptControl_iface);
1291 static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface)
1293 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1294 return IScriptControl_Release(&This->IScriptControl_iface);
1297 static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *clsid)
1299 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1301 FIXME("(%p)->(%p)\n", This, clsid);
1303 return E_NOTIMPL;
1306 static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface)
1308 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1310 FIXME("(%p)\n", This);
1312 return E_NOTIMPL;
1315 static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream)
1317 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1319 FIXME("(%p)->(%p)\n", This, stream);
1321 return E_NOTIMPL;
1324 static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, IStream *stream, BOOL clear_dirty)
1326 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1328 FIXME("(%p)->(%p %d)\n", This, stream, clear_dirty);
1330 return E_NOTIMPL;
1333 static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface, ULARGE_INTEGER *size)
1335 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1337 FIXME("(%p)->(%p)\n", This, size);
1339 return E_NOTIMPL;
1342 static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
1344 ScriptControl *This = impl_from_IPersistStreamInit(iface);
1346 FIXME("(%p)\n", This);
1348 return S_OK;
1351 static const IPersistStreamInitVtbl PersistStreamInitVtbl = {
1352 PersistStreamInit_QueryInterface,
1353 PersistStreamInit_AddRef,
1354 PersistStreamInit_Release,
1355 PersistStreamInit_GetClassID,
1356 PersistStreamInit_IsDirty,
1357 PersistStreamInit_Load,
1358 PersistStreamInit_Save,
1359 PersistStreamInit_GetSizeMax,
1360 PersistStreamInit_InitNew
1363 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **obj)
1365 ScriptControl *This = impl_from_IOleControl(iface);
1366 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
1369 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
1371 ScriptControl *This = impl_from_IOleControl(iface);
1372 return IScriptControl_AddRef(&This->IScriptControl_iface);
1375 static ULONG WINAPI OleControl_Release(IOleControl *iface)
1377 ScriptControl *This = impl_from_IOleControl(iface);
1378 return IScriptControl_Release(&This->IScriptControl_iface);
1381 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *info)
1383 ScriptControl *This = impl_from_IOleControl(iface);
1385 TRACE("(%p)->(%p)\n", This, info);
1387 if (!info)
1388 return E_POINTER;
1390 info->hAccel = NULL;
1391 info->cAccel = 0;
1393 return S_OK;
1396 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg)
1398 ScriptControl *This = impl_from_IOleControl(iface);
1400 FIXME("(%p)->(%p)\n", This, msg);
1402 return E_NOTIMPL;
1405 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispid)
1407 ScriptControl *This = impl_from_IOleControl(iface);
1409 FIXME("(%p)->(%#x)\n", This, dispid);
1411 return E_NOTIMPL;
1414 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze)
1416 ScriptControl *This = impl_from_IOleControl(iface);
1418 FIXME("(%p)->(%d)\n", This, freeze);
1420 return E_NOTIMPL;
1423 static const IOleControlVtbl OleControlVtbl = {
1424 OleControl_QueryInterface,
1425 OleControl_AddRef,
1426 OleControl_Release,
1427 OleControl_GetControlInfo,
1428 OleControl_OnMnemonic,
1429 OleControl_OnAmbientPropertyChange,
1430 OleControl_FreezeEvents
1433 static HRESULT WINAPI QuickActivate_QueryInterface(IQuickActivate *iface, REFIID riid, void **obj)
1435 ScriptControl *This = impl_from_IQuickActivate(iface);
1436 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
1439 static ULONG WINAPI QuickActivate_AddRef(IQuickActivate *iface)
1441 ScriptControl *This = impl_from_IQuickActivate(iface);
1442 return IScriptControl_AddRef(&This->IScriptControl_iface);
1445 static ULONG WINAPI QuickActivate_Release(IQuickActivate *iface)
1447 ScriptControl *This = impl_from_IQuickActivate(iface);
1448 return IScriptControl_Release(&This->IScriptControl_iface);
1451 static HRESULT WINAPI QuickActivate_QuickActivate(IQuickActivate *iface, QACONTAINER *container, QACONTROL *control)
1453 ScriptControl *This = impl_from_IQuickActivate(iface);
1455 FIXME("(%p)->(%p %p)\n", This, container, control);
1457 return E_NOTIMPL;
1460 static HRESULT WINAPI QuickActivate_SetContentExtent(IQuickActivate *iface, SIZEL *size)
1462 ScriptControl *This = impl_from_IQuickActivate(iface);
1464 FIXME("(%p)->(%p)\n", This, size);
1466 return E_NOTIMPL;
1469 static HRESULT WINAPI QuickActivate_GetContentExtent(IQuickActivate *iface, SIZEL *size)
1471 ScriptControl *This = impl_from_IQuickActivate(iface);
1473 FIXME("(%p)->(%p)\n", This, size);
1475 return E_NOTIMPL;
1478 static const IQuickActivateVtbl QuickActivateVtbl = {
1479 QuickActivate_QueryInterface,
1480 QuickActivate_AddRef,
1481 QuickActivate_Release,
1482 QuickActivate_QuickActivate,
1483 QuickActivate_SetContentExtent,
1484 QuickActivate_GetContentExtent
1487 static HRESULT WINAPI ViewObject_QueryInterface(IViewObjectEx *iface, REFIID riid, void **obj)
1489 ScriptControl *This = impl_from_IViewObjectEx(iface);
1490 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
1493 static ULONG WINAPI ViewObject_AddRef(IViewObjectEx *iface)
1495 ScriptControl *This = impl_from_IViewObjectEx(iface);
1496 return IScriptControl_AddRef(&This->IScriptControl_iface);
1499 static ULONG WINAPI ViewObject_Release(IViewObjectEx *iface)
1501 ScriptControl *This = impl_from_IViewObjectEx(iface);
1502 return IScriptControl_Release(&This->IScriptControl_iface);
1505 static HRESULT WINAPI ViewObject_Draw(IViewObjectEx *iface, DWORD drawaspect, LONG index, void *aspect,
1506 DVTARGETDEVICE *device, HDC target_dev, HDC hdc_draw, const RECTL *bounds, const RECTL *win_bounds,
1507 BOOL (STDMETHODCALLTYPE *fn_continue)(ULONG_PTR cont), ULONG_PTR cont)
1509 ScriptControl *This = impl_from_IViewObjectEx(iface);
1511 FIXME("(%p)->(%d %d %p %p %p %p %p %p %p %lu)\n", This, drawaspect, index, aspect, device, target_dev,
1512 hdc_draw, bounds, win_bounds, fn_continue, cont);
1514 return E_NOTIMPL;
1517 static HRESULT WINAPI ViewObject_GetColorSet(IViewObjectEx *iface, DWORD drawaspect, LONG index, void *aspect,
1518 DVTARGETDEVICE *device, HDC hic_target, LOGPALETTE **colorset)
1520 ScriptControl *This = impl_from_IViewObjectEx(iface);
1522 FIXME("(%p)->(%d %d %p %p %p %p)\n", This, drawaspect, index, aspect, device, hic_target,
1523 colorset);
1525 return E_NOTIMPL;
1528 static HRESULT WINAPI ViewObject_Freeze(IViewObjectEx *iface, DWORD drawaspect, LONG index, void *aspect,
1529 DWORD *freeze)
1531 ScriptControl *This = impl_from_IViewObjectEx(iface);
1533 FIXME("(%p)->(%d %d %p %p)\n", This, drawaspect, index, aspect, freeze);
1535 return E_NOTIMPL;
1538 static HRESULT WINAPI ViewObject_Unfreeze(IViewObjectEx *iface, DWORD freeze)
1540 ScriptControl *This = impl_from_IViewObjectEx(iface);
1542 FIXME("(%p)->(%d)\n", This, freeze);
1544 return E_NOTIMPL;
1547 static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, DWORD flags, IAdviseSink *sink)
1549 ScriptControl *This = impl_from_IViewObjectEx(iface);
1551 TRACE("(%p)->(%d %#x %p)\n", This, aspects, flags, sink);
1553 if (aspects != DVASPECT_CONTENT)
1554 return DV_E_DVASPECT;
1556 This->view_sink_flags = flags;
1557 if (This->view_sink)
1558 IAdviseSink_Release(This->view_sink);
1559 This->view_sink = sink;
1560 if (This->view_sink)
1561 IAdviseSink_AddRef(This->view_sink);
1563 return S_OK;
1566 static HRESULT WINAPI ViewObject_GetAdvise(IViewObjectEx *iface, DWORD *aspects, DWORD *flags, IAdviseSink **sink)
1568 ScriptControl *This = impl_from_IViewObjectEx(iface);
1570 TRACE("(%p)->(%p %p %p)\n", This, aspects, flags, sink);
1572 if (aspects)
1573 *aspects = DVASPECT_CONTENT;
1574 if (flags)
1575 *flags = This->view_sink_flags;
1576 if (sink) {
1577 *sink = This->view_sink;
1578 if (*sink)
1579 IAdviseSink_AddRef(*sink);
1582 return S_OK;
1585 static HRESULT WINAPI ViewObject_GetExtent(IViewObjectEx *iface, DWORD draw_aspect, LONG index,
1586 DVTARGETDEVICE *device, SIZEL *size)
1588 ScriptControl *This = impl_from_IViewObjectEx(iface);
1590 FIXME("(%p)->(%d %d %p %p)\n", This, draw_aspect, index, device, size);
1592 return E_NOTIMPL;
1595 static HRESULT WINAPI ViewObject_GetRect(IViewObjectEx *iface, DWORD aspect, RECTL *rect)
1597 ScriptControl *This = impl_from_IViewObjectEx(iface);
1599 FIXME("(%p)->(%d %p)\n", This, aspect, rect);
1601 return E_NOTIMPL;
1604 static HRESULT WINAPI ViewObject_GetViewStatus(IViewObjectEx *iface, DWORD *status)
1606 ScriptControl *This = impl_from_IViewObjectEx(iface);
1608 TRACE("(%p)->(%p)\n", This, status);
1610 *status = VIEWSTATUS_OPAQUE;
1611 return S_OK;
1614 static HRESULT WINAPI ViewObject_QueryHitPoint(IViewObjectEx *iface, DWORD aspect, const RECT *bounds,
1615 POINT pt, LONG close_hint, DWORD *hit_result)
1617 ScriptControl *This = impl_from_IViewObjectEx(iface);
1619 FIXME("(%p)->(%d %s %s %d %p)\n", This, aspect, wine_dbgstr_rect(bounds), wine_dbgstr_point(&pt), close_hint, hit_result);
1621 return E_NOTIMPL;
1624 static HRESULT WINAPI ViewObject_QueryHitRect(IViewObjectEx *iface, DWORD aspect, const RECT *bounds,
1625 const RECT *loc, LONG close_hint, DWORD *hit_result)
1627 ScriptControl *This = impl_from_IViewObjectEx(iface);
1629 FIXME("(%p)->(%d %s %s %d %p)\n", This, aspect, wine_dbgstr_rect(bounds), wine_dbgstr_rect(loc), close_hint, hit_result);
1631 return E_NOTIMPL;
1634 static HRESULT WINAPI ViewObject_GetNaturalExtent(IViewObjectEx *iface, DWORD aspect, LONG index,
1635 DVTARGETDEVICE *device, HDC target_hdc, DVEXTENTINFO *extent_info, SIZEL *size)
1637 ScriptControl *This = impl_from_IViewObjectEx(iface);
1639 FIXME("(%p)->(%d %d %p %p %p %p)\n", This, aspect, index, device, target_hdc, extent_info, size);
1641 return E_NOTIMPL;
1644 static const IViewObjectExVtbl ViewObjectExVtbl = {
1645 ViewObject_QueryInterface,
1646 ViewObject_AddRef,
1647 ViewObject_Release,
1648 ViewObject_Draw,
1649 ViewObject_GetColorSet,
1650 ViewObject_Freeze,
1651 ViewObject_Unfreeze,
1652 ViewObject_SetAdvise,
1653 ViewObject_GetAdvise,
1654 ViewObject_GetExtent,
1655 ViewObject_GetRect,
1656 ViewObject_GetViewStatus,
1657 ViewObject_QueryHitPoint,
1658 ViewObject_QueryHitRect,
1659 ViewObject_GetNaturalExtent
1662 static HRESULT WINAPI PointerInactive_QueryInterface(IPointerInactive *iface, REFIID riid, void **obj)
1664 ScriptControl *This = impl_from_IPointerInactive(iface);
1665 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
1668 static ULONG WINAPI PointerInactive_AddRef(IPointerInactive *iface)
1670 ScriptControl *This = impl_from_IPointerInactive(iface);
1671 return IScriptControl_AddRef(&This->IScriptControl_iface);
1674 static ULONG WINAPI PointerInactive_Release(IPointerInactive *iface)
1676 ScriptControl *This = impl_from_IPointerInactive(iface);
1677 return IScriptControl_Release(&This->IScriptControl_iface);
1680 static HRESULT WINAPI PointerInactive_GetActivationPolicy(IPointerInactive *iface, DWORD *policy)
1682 ScriptControl *This = impl_from_IPointerInactive(iface);
1684 TRACE("(%p)->(%p)\n", This, policy);
1686 if (!policy)
1687 return E_POINTER;
1689 *policy = 0;
1690 return S_OK;
1693 static HRESULT WINAPI PointerInactive_OnInactiveMouseMove(IPointerInactive *iface, const RECT *bounds,
1694 LONG x, LONG y, DWORD key_state)
1696 ScriptControl *This = impl_from_IPointerInactive(iface);
1698 FIXME("(%p)->(%s %d %d %#x)\n", This, wine_dbgstr_rect(bounds), x, y, key_state);
1700 return E_NOTIMPL;
1703 static HRESULT WINAPI PointerInactive_OnInactiveSetCursor(IPointerInactive *iface, const RECT *bounds,
1704 LONG x, LONG y, DWORD msg, BOOL set_always)
1706 ScriptControl *This = impl_from_IPointerInactive(iface);
1708 FIXME("(%p)->(%s %d %d %#x %d)\n", This, wine_dbgstr_rect(bounds), x, y, msg, set_always);
1710 return E_NOTIMPL;
1713 static const IPointerInactiveVtbl PointerInactiveVtbl = {
1714 PointerInactive_QueryInterface,
1715 PointerInactive_AddRef,
1716 PointerInactive_Release,
1717 PointerInactive_GetActivationPolicy,
1718 PointerInactive_OnInactiveMouseMove,
1719 PointerInactive_OnInactiveSetCursor
1722 static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, REFIID riid, void **obj)
1724 ScriptControl *This = impl_from_IConnectionPointContainer(iface);
1725 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
1728 static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface)
1730 ScriptControl *This = impl_from_IConnectionPointContainer(iface);
1731 return IScriptControl_AddRef(&This->IScriptControl_iface);
1734 static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface)
1736 ScriptControl *This = impl_from_IConnectionPointContainer(iface);
1737 return IScriptControl_Release(&This->IScriptControl_iface);
1740 static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, IEnumConnectionPoints **enum_points)
1742 ScriptControl *This = impl_from_IConnectionPointContainer(iface);
1744 FIXME("(%p)->(%p)\n", This, enum_points);
1746 return E_NOTIMPL;
1749 static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, REFIID riid, IConnectionPoint **cp)
1751 ScriptControl *This = impl_from_IConnectionPointContainer(iface);
1752 ConnectionPoint *iter;
1754 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), cp);
1756 *cp = NULL;
1758 for (iter = This->cp_list; iter; iter = iter->next) {
1759 if (IsEqualIID(iter->riid, riid))
1760 *cp = &iter->IConnectionPoint_iface;
1763 if (*cp) {
1764 IConnectionPoint_AddRef(*cp);
1765 return S_OK;
1768 FIXME("unsupported connection point %s\n", debugstr_guid(riid));
1769 return CONNECT_E_NOCONNECTION;
1772 static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = {
1773 ConnectionPointContainer_QueryInterface,
1774 ConnectionPointContainer_AddRef,
1775 ConnectionPointContainer_Release,
1776 ConnectionPointContainer_EnumConnectionPoints,
1777 ConnectionPointContainer_FindConnectionPoint
1780 static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface,
1781 REFIID riid, void **ppv)
1783 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
1785 if(IsEqualGUID(&IID_IUnknown, riid)) {
1786 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
1787 *ppv = &This->IConnectionPoint_iface;
1788 }else if(IsEqualGUID(&IID_IConnectionPoint, riid)) {
1789 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
1790 *ppv = &This->IConnectionPoint_iface;
1791 }else {
1792 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
1793 *ppv = NULL;
1794 return E_NOINTERFACE;
1797 IUnknown_AddRef((IUnknown*)*ppv);
1798 return S_OK;
1801 static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface)
1803 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
1804 return IConnectionPointContainer_AddRef(&This->control->IConnectionPointContainer_iface);
1807 static ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface)
1809 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
1810 return IConnectionPointContainer_Release(&This->control->IConnectionPointContainer_iface);
1813 static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *iid)
1815 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
1817 TRACE("(%p)->(%p)\n", This, iid);
1819 *iid = *This->riid;
1820 return S_OK;
1823 static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoint *iface,
1824 IConnectionPointContainer **container)
1826 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
1828 TRACE("(%p)->(%p)\n", This, container);
1830 if (!container)
1831 return E_POINTER;
1833 *container = &This->control->IConnectionPointContainer_iface;
1834 IConnectionPointContainer_AddRef(*container);
1836 return S_OK;
1839 static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *unk_sink,
1840 DWORD *cookie)
1842 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
1844 FIXME("(%p)->(%p %p)\n", This, unk_sink, cookie);
1846 return E_NOTIMPL;
1849 static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD cookie)
1851 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
1853 FIXME("(%p)->(%d)\n", This, cookie);
1855 return E_NOTIMPL;
1858 static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface,
1859 IEnumConnections **ppEnum)
1861 ConnectionPoint *This = impl_from_IConnectionPoint(iface);
1863 FIXME("(%p)->(%p): stub\n", This, ppEnum);
1865 return E_NOTIMPL;
1868 static const IConnectionPointVtbl ConnectionPointVtbl =
1870 ConnectionPoint_QueryInterface,
1871 ConnectionPoint_AddRef,
1872 ConnectionPoint_Release,
1873 ConnectionPoint_GetConnectionInterface,
1874 ConnectionPoint_GetConnectionPointContainer,
1875 ConnectionPoint_Advise,
1876 ConnectionPoint_Unadvise,
1877 ConnectionPoint_EnumConnections
1880 static void ConnectionPoint_Init(ConnectionPoint *cp, ScriptControl *sc, REFIID riid)
1882 cp->IConnectionPoint_iface.lpVtbl = &ConnectionPointVtbl;
1883 cp->control = sc;
1884 cp->riid = riid;
1886 cp->next = sc->cp_list;
1887 sc->cp_list = cp;
1890 static HRESULT WINAPI ScriptControl_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
1892 ScriptControl *script_control;
1893 DWORD dpi_x, dpi_y;
1894 HRESULT hres;
1895 HDC hdc;
1897 TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
1899 script_control = heap_alloc(sizeof(*script_control));
1900 if(!script_control)
1901 return E_OUTOFMEMORY;
1903 script_control->IScriptControl_iface.lpVtbl = &ScriptControlVtbl;
1904 script_control->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl;
1905 script_control->IOleObject_iface.lpVtbl = &OleObjectVtbl;
1906 script_control->IOleControl_iface.lpVtbl = &OleControlVtbl;
1907 script_control->IQuickActivate_iface.lpVtbl = &QuickActivateVtbl;
1908 script_control->IViewObjectEx_iface.lpVtbl = &ViewObjectExVtbl;
1909 script_control->IPointerInactive_iface.lpVtbl = &PointerInactiveVtbl;
1910 script_control->IConnectionPointContainer_iface.lpVtbl = &ConnectionPointContainerVtbl;
1911 script_control->ref = 1;
1912 script_control->site = NULL;
1913 script_control->cp_list = NULL;
1914 script_control->host = NULL;
1915 script_control->timeout = 10000;
1916 script_control->view_sink_flags = 0;
1917 script_control->view_sink = NULL;
1918 script_control->allow_ui = VARIANT_TRUE;
1919 script_control->use_safe_subset = VARIANT_FALSE;
1920 script_control->state = Initialized;
1922 ConnectionPoint_Init(&script_control->cp_scsource, script_control, &DIID_DScriptControlSource);
1923 ConnectionPoint_Init(&script_control->cp_propnotif, script_control, &IID_IPropertyNotifySink);
1925 hdc = GetDC(0);
1926 dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
1927 dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
1928 ReleaseDC(0, hdc);
1930 script_control->extent.cx = MulDiv(38, 2540, dpi_x);
1931 script_control->extent.cy = MulDiv(38, 2540, dpi_y);
1933 hres = IScriptControl_QueryInterface(&script_control->IScriptControl_iface, riid, ppv);
1934 IScriptControl_Release(&script_control->IScriptControl_iface);
1935 return hres;
1938 /******************************************************************
1939 * DllMain (msscript.ocx.@)
1941 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
1943 TRACE("(%p %d %p)\n", instance, reason, reserved);
1945 switch(reason) {
1946 case DLL_WINE_PREATTACH:
1947 return FALSE; /* prefer native version */
1948 case DLL_PROCESS_ATTACH:
1949 msscript_instance = instance;
1950 DisableThreadLibraryCalls(instance);
1951 break;
1952 case DLL_PROCESS_DETACH:
1953 if(!reserved)
1954 release_typelib();
1955 break;
1958 return TRUE;
1961 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
1963 *ppv = NULL;
1965 if(IsEqualGUID(&IID_IUnknown, riid)) {
1966 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
1967 *ppv = iface;
1968 }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
1969 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
1970 *ppv = iface;
1973 if(*ppv) {
1974 IUnknown_AddRef((IUnknown*)*ppv);
1975 return S_OK;
1978 WARN("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
1979 return E_NOINTERFACE;
1982 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
1984 TRACE("(%p)\n", iface);
1985 return 2;
1988 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
1990 TRACE("(%p)\n", iface);
1991 return 1;
1994 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
1996 TRACE("(%p)->(%x)\n", iface, fLock);
1997 return S_OK;
2000 static const IClassFactoryVtbl ScriptControlFactoryVtbl = {
2001 ClassFactory_QueryInterface,
2002 ClassFactory_AddRef,
2003 ClassFactory_Release,
2004 ScriptControl_CreateInstance,
2005 ClassFactory_LockServer
2008 static IClassFactory ScriptControlFactory = { &ScriptControlFactoryVtbl };
2010 /***********************************************************************
2011 * DllGetClassObject (msscript.ocx.@)
2013 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
2015 if(IsEqualGUID(&CLSID_ScriptControl, rclsid)) {
2016 TRACE("(CLSID_ScriptControl %s %p)\n", debugstr_guid(riid), ppv);
2017 return IClassFactory_QueryInterface(&ScriptControlFactory, riid, ppv);
2020 FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
2021 return CLASS_E_CLASSNOTAVAILABLE;
2024 /***********************************************************************
2025 * DllCanUnloadNow (msscript.ocx.@)
2027 HRESULT WINAPI DllCanUnloadNow(void)
2029 TRACE("\n");
2030 return S_FALSE;
2033 /***********************************************************************
2034 * DllRegisterServer (msscript.ocx.@)
2036 HRESULT WINAPI DllRegisterServer(void)
2038 TRACE("()\n");
2039 return __wine_register_resources(msscript_instance);
2042 /***********************************************************************
2043 * DllUnregisterServer (msscript.ocx.@)
2045 HRESULT WINAPI DllUnregisterServer(void)
2047 TRACE("()\n");
2048 return __wine_unregister_resources(msscript_instance);