msscript: Implement GetControlInfo().
[wine.git] / dlls / msscript.ocx / msscript.c
blob5a03f0c8bd3351453227011f93ce748c56bfb688
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 "rpcproxy.h"
26 #include "msscript.h"
28 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(msscript);
32 struct ScriptControl {
33 IScriptControl IScriptControl_iface;
34 IPersistStreamInit IPersistStreamInit_iface;
35 IOleObject IOleObject_iface;
36 IOleControl IOleControl_iface;
37 LONG ref;
38 IOleClientSite *site;
39 SIZEL extent;
42 static HINSTANCE msscript_instance;
44 static inline void * __WINE_ALLOC_SIZE(1) heap_alloc(size_t len)
46 return HeapAlloc(GetProcessHeap(), 0, len);
49 static inline BOOL heap_free(void *mem)
51 return HeapFree(GetProcessHeap(), 0, mem);
54 typedef enum tid_t {
55 IScriptControl_tid,
56 LAST_tid
57 } tid_t;
59 static ITypeLib *typelib;
60 static ITypeInfo *typeinfos[LAST_tid];
62 static REFIID tid_ids[] = {
63 &IID_IScriptControl
66 static HRESULT load_typelib(void)
68 HRESULT hres;
69 ITypeLib *tl;
71 hres = LoadRegTypeLib(&LIBID_MSScriptControl, 1, 0, LOCALE_SYSTEM_DEFAULT, &tl);
72 if(FAILED(hres)) {
73 ERR("LoadRegTypeLib failed: %08x\n", hres);
74 return hres;
77 if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
78 ITypeLib_Release(tl);
79 return hres;
82 static HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
84 HRESULT hres;
86 if (!typelib)
87 hres = load_typelib();
88 if (!typelib)
89 return hres;
91 if(!typeinfos[tid]) {
92 ITypeInfo *ti;
94 hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
95 if(FAILED(hres)) {
96 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres);
97 return hres;
100 if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL))
101 ITypeInfo_Release(ti);
104 *typeinfo = typeinfos[tid];
105 ITypeInfo_AddRef(typeinfos[tid]);
106 return S_OK;
109 static void release_typelib(void)
111 unsigned i;
113 if(!typelib)
114 return;
116 for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
117 if(typeinfos[i])
118 ITypeInfo_Release(typeinfos[i]);
120 ITypeLib_Release(typelib);
123 static inline ScriptControl *impl_from_IScriptControl(IScriptControl *iface)
125 return CONTAINING_RECORD(iface, ScriptControl, IScriptControl_iface);
128 static inline ScriptControl *impl_from_IOleObject(IOleObject *iface)
130 return CONTAINING_RECORD(iface, ScriptControl, IOleObject_iface);
133 static inline ScriptControl *impl_from_IPersistStreamInit(IPersistStreamInit *iface)
135 return CONTAINING_RECORD(iface, ScriptControl, IPersistStreamInit_iface);
138 static inline ScriptControl *impl_from_IOleControl(IOleControl *iface)
140 return CONTAINING_RECORD(iface, ScriptControl, IOleControl_iface);
143 static HRESULT WINAPI ScriptControl_QueryInterface(IScriptControl *iface, REFIID riid, void **ppv)
145 ScriptControl *This = impl_from_IScriptControl(iface);
147 if(IsEqualGUID(&IID_IUnknown, riid)) {
148 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
149 *ppv = &This->IScriptControl_iface;
150 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
151 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
152 *ppv = &This->IScriptControl_iface;
153 }else if(IsEqualGUID(&IID_IScriptControl, riid)) {
154 TRACE("(%p)->(IID_IScriptControl %p)\n", This, ppv);
155 *ppv = &This->IScriptControl_iface;
156 }else if(IsEqualGUID(&IID_IOleObject, riid)) {
157 TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv);
158 *ppv = &This->IOleObject_iface;
159 }else if(IsEqualGUID(&IID_IPersistStreamInit, riid)) {
160 TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
161 *ppv = &This->IPersistStreamInit_iface;
162 }else if(IsEqualGUID(&IID_IPersist, riid)) {
163 TRACE("(%p)->(IID_IPersist %p)\n", This, ppv);
164 *ppv = &This->IPersistStreamInit_iface;
165 }else if(IsEqualGUID(&IID_IOleControl, riid)) {
166 TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv);
167 *ppv = &This->IOleControl_iface;
168 }else {
169 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
170 *ppv = NULL;
171 return E_NOINTERFACE;
174 IUnknown_AddRef((IUnknown*)*ppv);
175 return S_OK;
178 static ULONG WINAPI ScriptControl_AddRef(IScriptControl *iface)
180 ScriptControl *This = impl_from_IScriptControl(iface);
181 LONG ref = InterlockedIncrement(&This->ref);
183 TRACE("(%p) ref=%d\n", This, ref);
185 return ref;
188 static ULONG WINAPI ScriptControl_Release(IScriptControl *iface)
190 ScriptControl *This = impl_from_IScriptControl(iface);
191 LONG ref = InterlockedDecrement(&This->ref);
193 TRACE("(%p) ref=%d\n", This, ref);
195 if(!ref) {
196 if (This->site)
197 IOleClientSite_Release(This->site);
198 heap_free(This);
201 return ref;
204 static HRESULT WINAPI ScriptControl_GetTypeInfoCount(IScriptControl *iface, UINT *pctinfo)
206 ScriptControl *This = impl_from_IScriptControl(iface);
207 TRACE("(%p)->(%p)\n", This, pctinfo);
208 *pctinfo = 1;
209 return S_OK;
212 static HRESULT WINAPI ScriptControl_GetTypeInfo(IScriptControl *iface, UINT iTInfo,
213 LCID lcid, ITypeInfo **ppTInfo)
215 ScriptControl *This = impl_from_IScriptControl(iface);
216 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
217 return get_typeinfo(IScriptControl_tid, ppTInfo);
220 static HRESULT WINAPI ScriptControl_GetIDsOfNames(IScriptControl *iface, REFIID riid,
221 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
223 ScriptControl *This = impl_from_IScriptControl(iface);
224 ITypeInfo *typeinfo;
225 HRESULT hres;
227 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
229 hres = get_typeinfo(IScriptControl_tid, &typeinfo);
230 if(SUCCEEDED(hres)) {
231 hres = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
232 ITypeInfo_Release(typeinfo);
235 return hres;
238 static HRESULT WINAPI ScriptControl_Invoke(IScriptControl *iface, DISPID dispIdMember,
239 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
240 EXCEPINFO *pExcepInfo, UINT *puArgErr)
242 ScriptControl *This = impl_from_IScriptControl(iface);
243 ITypeInfo *typeinfo;
244 HRESULT hres;
246 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
247 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
249 hres = get_typeinfo(IScriptControl_tid, &typeinfo);
250 if(SUCCEEDED(hres)) {
251 hres = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags,
252 pDispParams, pVarResult, pExcepInfo, puArgErr);
253 ITypeInfo_Release(typeinfo);
256 return hres;
259 static HRESULT WINAPI ScriptControl_get_Language(IScriptControl *iface, BSTR *p)
261 ScriptControl *This = impl_from_IScriptControl(iface);
262 FIXME("(%p)->(%p)\n", This, p);
263 return E_NOTIMPL;
266 static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR language)
268 ScriptControl *This = impl_from_IScriptControl(iface);
269 FIXME("(%p)->(%s)\n", This, debugstr_w(language));
270 return E_NOTIMPL;
273 static HRESULT WINAPI ScriptControl_get_State(IScriptControl *iface, ScriptControlStates *p)
275 ScriptControl *This = impl_from_IScriptControl(iface);
276 FIXME("(%p)->(%p)\n", This, p);
277 return E_NOTIMPL;
280 static HRESULT WINAPI ScriptControl_put_State(IScriptControl *iface, ScriptControlStates state)
282 ScriptControl *This = impl_from_IScriptControl(iface);
283 FIXME("(%p)->(%x)\n", This, state);
284 return E_NOTIMPL;
287 static HRESULT WINAPI ScriptControl_put_SitehWnd(IScriptControl *iface, LONG hwnd)
289 ScriptControl *This = impl_from_IScriptControl(iface);
290 FIXME("(%p)->(%x)\n", This, hwnd);
291 return E_NOTIMPL;
294 static HRESULT WINAPI ScriptControl_get_SitehWnd(IScriptControl *iface, LONG *p)
296 ScriptControl *This = impl_from_IScriptControl(iface);
297 FIXME("(%p)->(%p)\n", This, p);
298 return E_NOTIMPL;
301 static HRESULT WINAPI ScriptControl_get_Timeout(IScriptControl *iface, LONG *p)
303 ScriptControl *This = impl_from_IScriptControl(iface);
304 FIXME("(%p)->(%p)\n", This, p);
305 return E_NOTIMPL;
308 static HRESULT WINAPI ScriptControl_put_Timeout(IScriptControl *iface, LONG milliseconds)
310 ScriptControl *This = impl_from_IScriptControl(iface);
311 FIXME("(%p)->(%d)\n", This, milliseconds);
312 return E_NOTIMPL;
315 static HRESULT WINAPI ScriptControl_get_AllowUI(IScriptControl *iface, VARIANT_BOOL *p)
317 ScriptControl *This = impl_from_IScriptControl(iface);
318 FIXME("(%p)->(%p)\n", This, p);
319 return E_NOTIMPL;
322 static HRESULT WINAPI ScriptControl_put_AllowUI(IScriptControl *iface, VARIANT_BOOL allow_ui)
324 ScriptControl *This = impl_from_IScriptControl(iface);
325 FIXME("(%p)->(%x)\n", This, allow_ui);
326 return E_NOTIMPL;
329 static HRESULT WINAPI ScriptControl_get_UseSafeSubset(IScriptControl *iface, VARIANT_BOOL *p)
331 ScriptControl *This = impl_from_IScriptControl(iface);
332 FIXME("(%p)->(%p)\n", This, p);
333 return E_NOTIMPL;
336 static HRESULT WINAPI ScriptControl_put_UseSafeSubset(IScriptControl *iface, VARIANT_BOOL v)
338 ScriptControl *This = impl_from_IScriptControl(iface);
339 FIXME("(%p)->(%x)\n", This, v);
340 return E_NOTIMPL;
343 static HRESULT WINAPI ScriptControl_get_Modules(IScriptControl *iface, IScriptModuleCollection **p)
345 ScriptControl *This = impl_from_IScriptControl(iface);
346 FIXME("(%p)->(%p)\n", This, p);
347 return E_NOTIMPL;
350 static HRESULT WINAPI ScriptControl_get_Error(IScriptControl *iface, IScriptError **p)
352 ScriptControl *This = impl_from_IScriptControl(iface);
353 FIXME("(%p)->(%p)\n", This, p);
354 return E_NOTIMPL;
357 static HRESULT WINAPI ScriptControl_get_CodeObject(IScriptControl *iface, IDispatch **p)
359 ScriptControl *This = impl_from_IScriptControl(iface);
360 FIXME("(%p)->(%p)\n", This, p);
361 return E_NOTIMPL;
364 static HRESULT WINAPI ScriptControl_get_Procedures(IScriptControl *iface, IScriptProcedureCollection **p)
366 ScriptControl *This = impl_from_IScriptControl(iface);
367 FIXME("(%p)->(%p)\n", This, p);
368 return E_NOTIMPL;
371 static HRESULT WINAPI ScriptControl__AboutBox(IScriptControl *iface)
373 ScriptControl *This = impl_from_IScriptControl(iface);
374 FIXME("(%p)\n", This);
375 return E_NOTIMPL;
378 static HRESULT WINAPI ScriptControl_AddObject(IScriptControl *iface, BSTR name, IDispatch *object, VARIANT_BOOL add_members)
380 ScriptControl *This = impl_from_IScriptControl(iface);
381 FIXME("(%p)->(%s %p %x)\n", This, debugstr_w(name), object, add_members);
382 return E_NOTIMPL;
385 static HRESULT WINAPI ScriptControl_Reset(IScriptControl *iface)
387 ScriptControl *This = impl_from_IScriptControl(iface);
388 FIXME("(%p)\n", This);
389 return E_NOTIMPL;
392 static HRESULT WINAPI ScriptControl_AddCode(IScriptControl *iface, BSTR code)
394 ScriptControl *This = impl_from_IScriptControl(iface);
395 FIXME("(%p)->(%s)\n", This, debugstr_w(code));
396 return E_NOTIMPL;
399 static HRESULT WINAPI ScriptControl_Eval(IScriptControl *iface, BSTR expression, VARIANT *res)
401 ScriptControl *This = impl_from_IScriptControl(iface);
402 FIXME("(%p)->(%s %p)\n", This, debugstr_w(expression), res);
403 return E_NOTIMPL;
406 static HRESULT WINAPI ScriptControl_ExecuteStatement(IScriptControl *iface, BSTR statement)
408 ScriptControl *This = impl_from_IScriptControl(iface);
409 FIXME("(%p)->(%s)\n", This, debugstr_w(statement));
410 return E_NOTIMPL;
413 static HRESULT WINAPI ScriptControl_Run(IScriptControl *iface, BSTR procedure_name, SAFEARRAY **parameters, VARIANT *res)
415 ScriptControl *This = impl_from_IScriptControl(iface);
416 FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(procedure_name), parameters, res);
417 return E_NOTIMPL;
420 static const IScriptControlVtbl ScriptControlVtbl = {
421 ScriptControl_QueryInterface,
422 ScriptControl_AddRef,
423 ScriptControl_Release,
424 ScriptControl_GetTypeInfoCount,
425 ScriptControl_GetTypeInfo,
426 ScriptControl_GetIDsOfNames,
427 ScriptControl_Invoke,
428 ScriptControl_get_Language,
429 ScriptControl_put_Language,
430 ScriptControl_get_State,
431 ScriptControl_put_State,
432 ScriptControl_put_SitehWnd,
433 ScriptControl_get_SitehWnd,
434 ScriptControl_get_Timeout,
435 ScriptControl_put_Timeout,
436 ScriptControl_get_AllowUI,
437 ScriptControl_put_AllowUI,
438 ScriptControl_get_UseSafeSubset,
439 ScriptControl_put_UseSafeSubset,
440 ScriptControl_get_Modules,
441 ScriptControl_get_Error,
442 ScriptControl_get_CodeObject,
443 ScriptControl_get_Procedures,
444 ScriptControl__AboutBox,
445 ScriptControl_AddObject,
446 ScriptControl_Reset,
447 ScriptControl_AddCode,
448 ScriptControl_Eval,
449 ScriptControl_ExecuteStatement,
450 ScriptControl_Run
453 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **obj)
455 ScriptControl *This = impl_from_IOleObject(iface);
456 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
459 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
461 ScriptControl *This = impl_from_IOleObject(iface);
462 return IScriptControl_AddRef(&This->IScriptControl_iface);
465 static ULONG WINAPI OleObject_Release(IOleObject *iface)
467 ScriptControl *This = impl_from_IOleObject(iface);
468 return IScriptControl_Release(&This->IScriptControl_iface);
471 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *site)
473 ScriptControl *This = impl_from_IOleObject(iface);
475 TRACE("(%p)->(%p)\n", This, site);
477 if (This->site)
478 IOleClientSite_Release(This->site);
480 if ((This->site = site))
481 IOleClientSite_AddRef(site);
483 return S_OK;
486 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **site)
488 ScriptControl *This = impl_from_IOleObject(iface);
490 TRACE("(%p)->(%p)\n", This, site);
492 if (!site)
493 return E_POINTER;
495 if ((*site = This->site))
496 IOleClientSite_AddRef(*site);
498 return S_OK;
501 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR containerapp, LPCOLESTR containerobj)
503 ScriptControl *This = impl_from_IOleObject(iface);
505 FIXME("(%p)->(%s %s)\n", This, debugstr_w(containerapp), debugstr_w(containerobj));
507 return E_NOTIMPL;
510 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD save)
512 ScriptControl *This = impl_from_IOleObject(iface);
514 FIXME("(%p)->(%d)\n", This, save);
516 return E_NOTIMPL;
519 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD which, IMoniker *moniker)
521 ScriptControl *This = impl_from_IOleObject(iface);
523 FIXME("(%p)->(%d %p)\n", This, which, moniker);
525 return E_NOTIMPL;
528 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD assign, DWORD which, IMoniker **moniker)
530 ScriptControl *This = impl_from_IOleObject(iface);
532 FIXME("(%p)->(%d %d %p)\n", This, assign, which, moniker);
534 return E_NOTIMPL;
537 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *dataobj, BOOL creation,
538 DWORD reserved)
540 ScriptControl *This = impl_from_IOleObject(iface);
542 FIXME("(%p)->(%p %d %d)\n", This, dataobj, creation, reserved);
544 return E_NOTIMPL;
547 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD reserved, IDataObject **dataobj)
549 ScriptControl *This = impl_from_IOleObject(iface);
551 FIXME("(%p)->(%d %p)\n", This, reserved, dataobj);
553 return E_NOTIMPL;
556 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG verb, LPMSG msg, IOleClientSite *active_site,
557 LONG index, HWND hwndParent, LPCRECT rect)
559 ScriptControl *This = impl_from_IOleObject(iface);
561 FIXME("(%p)->(%d %p %p %d %p %p)\n", This, verb, msg, active_site, index, hwndParent, rect);
563 return E_NOTIMPL;
566 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **enumoleverb)
568 ScriptControl *This = impl_from_IOleObject(iface);
570 FIXME("(%p)->(%p)\n", This, enumoleverb);
572 return E_NOTIMPL;
575 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
577 ScriptControl *This = impl_from_IOleObject(iface);
579 FIXME("(%p)\n", This);
581 return E_NOTIMPL;
584 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
586 ScriptControl *This = impl_from_IOleObject(iface);
588 FIXME("(%p)\n", This);
590 return E_NOTIMPL;
593 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *clsid)
595 ScriptControl *This = impl_from_IOleObject(iface);
597 FIXME("(%p)->(%p)\n", This, clsid);
599 return E_NOTIMPL;
602 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD form_of_type, LPOLESTR *usertype)
604 ScriptControl *This = impl_from_IOleObject(iface);
606 FIXME("(%p)->(%d %p)\n", This, form_of_type, usertype);
608 return E_NOTIMPL;
611 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD aspect, SIZEL *size)
613 ScriptControl *This = impl_from_IOleObject(iface);
615 FIXME("(%p)->(%d %p)\n", This, aspect, size);
617 return E_NOTIMPL;
620 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD aspect, SIZEL *size)
622 ScriptControl *This = impl_from_IOleObject(iface);
624 TRACE("(%p)->(%d %p)\n", This, aspect, size);
626 if (aspect != DVASPECT_CONTENT)
627 return DV_E_DVASPECT;
629 *size = This->extent;
630 return S_OK;
633 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *sink, DWORD *connection)
635 ScriptControl *This = impl_from_IOleObject(iface);
637 FIXME("(%p)->(%p %p)\n", This, sink, connection);
639 return E_NOTIMPL;
642 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD connection)
644 ScriptControl *This = impl_from_IOleObject(iface);
646 FIXME("(%p)->(%d)\n", This, connection);
648 return E_NOTIMPL;
651 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **enumadvise)
653 ScriptControl *This = impl_from_IOleObject(iface);
655 FIXME("(%p)->(%p)\n", This, enumadvise);
657 return E_NOTIMPL;
660 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD aspect, DWORD *status)
662 ScriptControl *This = impl_from_IOleObject(iface);
664 TRACE("(%p)->(%d %p)\n", This, aspect, status);
666 return OleRegGetMiscStatus(&CLSID_ScriptControl, aspect, status);
669 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *logpal)
671 ScriptControl *This = impl_from_IOleObject(iface);
673 FIXME("(%p)->(%p)\n", This, logpal);
675 return E_NOTIMPL;
678 static const IOleObjectVtbl OleObjectVtbl = {
679 OleObject_QueryInterface,
680 OleObject_AddRef,
681 OleObject_Release,
682 OleObject_SetClientSite,
683 OleObject_GetClientSite,
684 OleObject_SetHostNames,
685 OleObject_Close,
686 OleObject_SetMoniker,
687 OleObject_GetMoniker,
688 OleObject_InitFromData,
689 OleObject_GetClipboardData,
690 OleObject_DoVerb,
691 OleObject_EnumVerbs,
692 OleObject_Update,
693 OleObject_IsUpToDate,
694 OleObject_GetUserClassID,
695 OleObject_GetUserType,
696 OleObject_SetExtent,
697 OleObject_GetExtent,
698 OleObject_Advise,
699 OleObject_Unadvise,
700 OleObject_EnumAdvise,
701 OleObject_GetMiscStatus,
702 OleObject_SetColorScheme
705 static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface, REFIID riid, void **obj)
707 ScriptControl *This = impl_from_IPersistStreamInit(iface);
708 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
711 static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface)
713 ScriptControl *This = impl_from_IPersistStreamInit(iface);
714 return IScriptControl_AddRef(&This->IScriptControl_iface);
717 static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface)
719 ScriptControl *This = impl_from_IPersistStreamInit(iface);
720 return IScriptControl_Release(&This->IScriptControl_iface);
723 static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *clsid)
725 ScriptControl *This = impl_from_IPersistStreamInit(iface);
727 FIXME("(%p)->(%p)\n", This, clsid);
729 return E_NOTIMPL;
732 static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface)
734 ScriptControl *This = impl_from_IPersistStreamInit(iface);
736 FIXME("(%p)\n", This);
738 return E_NOTIMPL;
741 static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream)
743 ScriptControl *This = impl_from_IPersistStreamInit(iface);
745 FIXME("(%p)->(%p)\n", This, stream);
747 return E_NOTIMPL;
750 static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, IStream *stream, BOOL clear_dirty)
752 ScriptControl *This = impl_from_IPersistStreamInit(iface);
754 FIXME("(%p)->(%p %d)\n", This, stream, clear_dirty);
756 return E_NOTIMPL;
759 static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface, ULARGE_INTEGER *size)
761 ScriptControl *This = impl_from_IPersistStreamInit(iface);
763 FIXME("(%p)->(%p)\n", This, size);
765 return E_NOTIMPL;
768 static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
770 ScriptControl *This = impl_from_IPersistStreamInit(iface);
772 FIXME("(%p)\n", This);
774 return S_OK;
777 static const IPersistStreamInitVtbl PersistStreamInitVtbl = {
778 PersistStreamInit_QueryInterface,
779 PersistStreamInit_AddRef,
780 PersistStreamInit_Release,
781 PersistStreamInit_GetClassID,
782 PersistStreamInit_IsDirty,
783 PersistStreamInit_Load,
784 PersistStreamInit_Save,
785 PersistStreamInit_GetSizeMax,
786 PersistStreamInit_InitNew
789 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **obj)
791 ScriptControl *This = impl_from_IOleControl(iface);
792 return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj);
795 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
797 ScriptControl *This = impl_from_IOleControl(iface);
798 return IScriptControl_AddRef(&This->IScriptControl_iface);
801 static ULONG WINAPI OleControl_Release(IOleControl *iface)
803 ScriptControl *This = impl_from_IOleControl(iface);
804 return IScriptControl_Release(&This->IScriptControl_iface);
807 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *info)
809 ScriptControl *This = impl_from_IOleControl(iface);
811 TRACE("(%p)->(%p)\n", This, info);
813 if (!info)
814 return E_POINTER;
816 info->hAccel = NULL;
817 info->cAccel = 0;
819 return S_OK;
822 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg)
824 ScriptControl *This = impl_from_IOleControl(iface);
826 FIXME("(%p)->(%p)\n", This, msg);
828 return E_NOTIMPL;
831 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispid)
833 ScriptControl *This = impl_from_IOleControl(iface);
835 FIXME("(%p)->(%#x)\n", This, dispid);
837 return E_NOTIMPL;
840 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze)
842 ScriptControl *This = impl_from_IOleControl(iface);
844 FIXME("(%p)->(%d)\n", This, freeze);
846 return E_NOTIMPL;
849 static const IOleControlVtbl OleControlVtbl = {
850 OleControl_QueryInterface,
851 OleControl_AddRef,
852 OleControl_Release,
853 OleControl_GetControlInfo,
854 OleControl_OnMnemonic,
855 OleControl_OnAmbientPropertyChange,
856 OleControl_FreezeEvents
859 static HRESULT WINAPI ScriptControl_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
861 ScriptControl *script_control;
862 DWORD dpi_x, dpi_y;
863 HRESULT hres;
864 HDC hdc;
866 TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
868 script_control = heap_alloc(sizeof(*script_control));
869 if(!script_control)
870 return E_OUTOFMEMORY;
872 script_control->IScriptControl_iface.lpVtbl = &ScriptControlVtbl;
873 script_control->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl;
874 script_control->IOleObject_iface.lpVtbl = &OleObjectVtbl;
875 script_control->IOleControl_iface.lpVtbl = &OleControlVtbl;
876 script_control->ref = 1;
877 script_control->site = NULL;
879 hdc = GetDC(0);
880 dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
881 dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
882 ReleaseDC(0, hdc);
884 script_control->extent.cx = MulDiv(38, 2540, dpi_x);
885 script_control->extent.cy = MulDiv(38, 2540, dpi_y);
887 hres = IScriptControl_QueryInterface(&script_control->IScriptControl_iface, riid, ppv);
888 IScriptControl_Release(&script_control->IScriptControl_iface);
889 return hres;
892 /******************************************************************
893 * DllMain (msscript.ocx.@)
895 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
897 TRACE("(%p %d %p)\n", instance, reason, reserved);
899 switch(reason) {
900 case DLL_WINE_PREATTACH:
901 return FALSE; /* prefer native version */
902 case DLL_PROCESS_ATTACH:
903 msscript_instance = instance;
904 DisableThreadLibraryCalls(instance);
905 break;
906 case DLL_PROCESS_DETACH:
907 if(!reserved)
908 release_typelib();
909 break;
912 return TRUE;
915 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
917 *ppv = NULL;
919 if(IsEqualGUID(&IID_IUnknown, riid)) {
920 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
921 *ppv = iface;
922 }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
923 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
924 *ppv = iface;
927 if(*ppv) {
928 IUnknown_AddRef((IUnknown*)*ppv);
929 return S_OK;
932 WARN("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
933 return E_NOINTERFACE;
936 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
938 TRACE("(%p)\n", iface);
939 return 2;
942 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
944 TRACE("(%p)\n", iface);
945 return 1;
948 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
950 TRACE("(%p)->(%x)\n", iface, fLock);
951 return S_OK;
954 static const IClassFactoryVtbl ScriptControlFactoryVtbl = {
955 ClassFactory_QueryInterface,
956 ClassFactory_AddRef,
957 ClassFactory_Release,
958 ScriptControl_CreateInstance,
959 ClassFactory_LockServer
962 static IClassFactory ScriptControlFactory = { &ScriptControlFactoryVtbl };
964 /***********************************************************************
965 * DllGetClassObject (msscript.ocx.@)
967 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
969 if(IsEqualGUID(&CLSID_ScriptControl, rclsid)) {
970 TRACE("(CLSID_ScriptControl %s %p)\n", debugstr_guid(riid), ppv);
971 return IClassFactory_QueryInterface(&ScriptControlFactory, riid, ppv);
974 FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
975 return CLASS_E_CLASSNOTAVAILABLE;
978 /***********************************************************************
979 * DllCanUnloadNow (msscript.ocx.@)
981 HRESULT WINAPI DllCanUnloadNow(void)
983 TRACE("\n");
984 return S_FALSE;
987 /***********************************************************************
988 * DllRegisterServer (msscript.ocx.@)
990 HRESULT WINAPI DllRegisterServer(void)
992 TRACE("()\n");
993 return __wine_register_resources(msscript_instance);
996 /***********************************************************************
997 * DllUnregisterServer (msscript.ocx.@)
999 HRESULT WINAPI DllUnregisterServer(void)
1001 TRACE("()\n");
1002 return __wine_unregister_resources(msscript_instance);