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
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
;
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
);
59 static ITypeLib
*typelib
;
60 static ITypeInfo
*typeinfos
[LAST_tid
];
62 static REFIID tid_ids
[] = {
66 static HRESULT
load_typelib(void)
71 hres
= LoadRegTypeLib(&LIBID_MSScriptControl
, 1, 0, LOCALE_SYSTEM_DEFAULT
, &tl
);
73 ERR("LoadRegTypeLib failed: %08x\n", hres
);
77 if(InterlockedCompareExchangePointer((void**)&typelib
, tl
, NULL
))
82 static HRESULT
get_typeinfo(tid_t tid
, ITypeInfo
**typeinfo
)
87 hres
= load_typelib();
94 hres
= ITypeLib_GetTypeInfoOfGuid(typelib
, tid_ids
[tid
], &ti
);
96 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids
[tid
]), hres
);
100 if(InterlockedCompareExchangePointer((void**)(typeinfos
+tid
), ti
, NULL
))
101 ITypeInfo_Release(ti
);
104 *typeinfo
= typeinfos
[tid
];
105 ITypeInfo_AddRef(typeinfos
[tid
]);
109 static void release_typelib(void)
116 for(i
=0; i
< sizeof(typeinfos
)/sizeof(*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
;
169 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
171 return E_NOINTERFACE
;
174 IUnknown_AddRef((IUnknown
*)*ppv
);
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
);
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
);
197 IOleClientSite_Release(This
->site
);
204 static HRESULT WINAPI
ScriptControl_GetTypeInfoCount(IScriptControl
*iface
, UINT
*pctinfo
)
206 ScriptControl
*This
= impl_from_IScriptControl(iface
);
207 TRACE("(%p)->(%p)\n", This
, pctinfo
);
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
);
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
);
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
);
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
);
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
);
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
));
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
371 static HRESULT WINAPI
ScriptControl__AboutBox(IScriptControl
*iface
)
373 ScriptControl
*This
= impl_from_IScriptControl(iface
);
374 FIXME("(%p)\n", This
);
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
);
385 static HRESULT WINAPI
ScriptControl_Reset(IScriptControl
*iface
)
387 ScriptControl
*This
= impl_from_IScriptControl(iface
);
388 FIXME("(%p)\n", This
);
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
));
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
);
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
));
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
);
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
,
447 ScriptControl_AddCode
,
449 ScriptControl_ExecuteStatement
,
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
);
478 IOleClientSite_Release(This
->site
);
480 if ((This
->site
= site
))
481 IOleClientSite_AddRef(site
);
486 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, IOleClientSite
**site
)
488 ScriptControl
*This
= impl_from_IOleObject(iface
);
490 TRACE("(%p)->(%p)\n", This
, site
);
495 if ((*site
= This
->site
))
496 IOleClientSite_AddRef(*site
);
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
));
510 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD save
)
512 ScriptControl
*This
= impl_from_IOleObject(iface
);
514 FIXME("(%p)->(%d)\n", This
, save
);
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
);
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
);
537 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, IDataObject
*dataobj
, BOOL creation
,
540 ScriptControl
*This
= impl_from_IOleObject(iface
);
542 FIXME("(%p)->(%p %d %d)\n", This
, dataobj
, creation
, reserved
);
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
);
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
);
566 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**enumoleverb
)
568 ScriptControl
*This
= impl_from_IOleObject(iface
);
570 FIXME("(%p)->(%p)\n", This
, enumoleverb
);
575 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
577 ScriptControl
*This
= impl_from_IOleObject(iface
);
579 FIXME("(%p)\n", This
);
584 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
586 ScriptControl
*This
= impl_from_IOleObject(iface
);
588 FIXME("(%p)\n", This
);
593 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
*clsid
)
595 ScriptControl
*This
= impl_from_IOleObject(iface
);
597 FIXME("(%p)->(%p)\n", This
, clsid
);
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
);
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
);
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
;
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
);
642 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD connection
)
644 ScriptControl
*This
= impl_from_IOleObject(iface
);
646 FIXME("(%p)->(%d)\n", This
, connection
);
651 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**enumadvise
)
653 ScriptControl
*This
= impl_from_IOleObject(iface
);
655 FIXME("(%p)->(%p)\n", This
, enumadvise
);
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
);
678 static const IOleObjectVtbl OleObjectVtbl
= {
679 OleObject_QueryInterface
,
682 OleObject_SetClientSite
,
683 OleObject_GetClientSite
,
684 OleObject_SetHostNames
,
686 OleObject_SetMoniker
,
687 OleObject_GetMoniker
,
688 OleObject_InitFromData
,
689 OleObject_GetClipboardData
,
693 OleObject_IsUpToDate
,
694 OleObject_GetUserClassID
,
695 OleObject_GetUserType
,
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
);
732 static HRESULT WINAPI
PersistStreamInit_IsDirty(IPersistStreamInit
*iface
)
734 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
736 FIXME("(%p)\n", This
);
741 static HRESULT WINAPI
PersistStreamInit_Load(IPersistStreamInit
*iface
, IStream
*stream
)
743 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
745 FIXME("(%p)->(%p)\n", This
, stream
);
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
);
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
);
768 static HRESULT WINAPI
PersistStreamInit_InitNew(IPersistStreamInit
*iface
)
770 ScriptControl
*This
= impl_from_IPersistStreamInit(iface
);
772 FIXME("(%p)\n", This
);
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
);
822 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, MSG
*msg
)
824 ScriptControl
*This
= impl_from_IOleControl(iface
);
826 FIXME("(%p)->(%p)\n", This
, msg
);
831 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispid
)
833 ScriptControl
*This
= impl_from_IOleControl(iface
);
835 FIXME("(%p)->(%#x)\n", This
, dispid
);
840 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL freeze
)
842 ScriptControl
*This
= impl_from_IOleControl(iface
);
844 FIXME("(%p)->(%d)\n", This
, freeze
);
849 static const IOleControlVtbl OleControlVtbl
= {
850 OleControl_QueryInterface
,
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
;
866 TRACE("(%p %s %p)\n", outer
, debugstr_guid(riid
), ppv
);
868 script_control
= heap_alloc(sizeof(*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
;
880 dpi_x
= GetDeviceCaps(hdc
, LOGPIXELSX
);
881 dpi_y
= GetDeviceCaps(hdc
, LOGPIXELSY
);
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
);
892 /******************************************************************
893 * DllMain (msscript.ocx.@)
895 BOOL WINAPI
DllMain(HINSTANCE instance
, DWORD reason
, void *reserved
)
897 TRACE("(%p %d %p)\n", instance
, reason
, reserved
);
900 case DLL_WINE_PREATTACH
:
901 return FALSE
; /* prefer native version */
902 case DLL_PROCESS_ATTACH
:
903 msscript_instance
= instance
;
904 DisableThreadLibraryCalls(instance
);
906 case DLL_PROCESS_DETACH
:
915 static HRESULT WINAPI
ClassFactory_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **ppv
)
919 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
920 TRACE("(%p)->(IID_IUnknown %p)\n", iface
, ppv
);
922 }else if(IsEqualGUID(&IID_IClassFactory
, riid
)) {
923 TRACE("(%p)->(IID_IClassFactory %p)\n", iface
, ppv
);
928 IUnknown_AddRef((IUnknown
*)*ppv
);
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
);
942 static ULONG WINAPI
ClassFactory_Release(IClassFactory
*iface
)
944 TRACE("(%p)\n", iface
);
948 static HRESULT WINAPI
ClassFactory_LockServer(IClassFactory
*iface
, BOOL fLock
)
950 TRACE("(%p)->(%x)\n", iface
, fLock
);
954 static const IClassFactoryVtbl ScriptControlFactoryVtbl
= {
955 ClassFactory_QueryInterface
,
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)
987 /***********************************************************************
988 * DllRegisterServer (msscript.ocx.@)
990 HRESULT WINAPI
DllRegisterServer(void)
993 return __wine_register_resources(msscript_instance
);
996 /***********************************************************************
997 * DllUnregisterServer (msscript.ocx.@)
999 HRESULT WINAPI
DllUnregisterServer(void)
1002 return __wine_unregister_resources(msscript_instance
);