| /* |
| * Copyright 2015 Jacek Caban for CodeWeavers |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #define COBJMACROS |
| |
| #include "windows.h" |
| #include "initguid.h" |
| #include "ole2.h" |
| #include "olectl.h" |
| #include "objsafe.h" |
| #include "activscp.h" |
| #include "rpcproxy.h" |
| #include "msscript.h" |
| |
| #include "wine/debug.h" |
| #include "wine/list.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(msscript); |
| |
| #ifdef _WIN64 |
| |
| #define IActiveScriptParse_Release IActiveScriptParse64_Release |
| #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew |
| #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText |
| |
| #else |
| |
| #define IActiveScriptParse_Release IActiveScriptParse32_Release |
| #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew |
| #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText |
| |
| #endif |
| |
| struct ScriptControl; |
| typedef struct ConnectionPoint ConnectionPoint; |
| |
| struct ConnectionPoint { |
| IConnectionPoint IConnectionPoint_iface; |
| ScriptControl *control; |
| const IID *riid; |
| ConnectionPoint *next; |
| }; |
| |
| struct named_item { |
| struct list entry; |
| BSTR name; |
| IDispatch *disp; |
| }; |
| |
| typedef struct ScriptHost { |
| IActiveScriptSite IActiveScriptSite_iface; |
| IActiveScriptSiteWindow IActiveScriptSiteWindow_iface; |
| IServiceProvider IServiceProvider_iface; |
| LONG ref; |
| |
| IActiveScript *script; |
| IActiveScriptParse *parse; |
| CLSID clsid; |
| |
| struct list named_items; |
| } ScriptHost; |
| |
| struct ScriptControl { |
| IScriptControl IScriptControl_iface; |
| IPersistStreamInit IPersistStreamInit_iface; |
| IOleObject IOleObject_iface; |
| IOleControl IOleControl_iface; |
| IQuickActivate IQuickActivate_iface; |
| IViewObjectEx IViewObjectEx_iface; |
| IPointerInactive IPointerInactive_iface; |
| IConnectionPointContainer IConnectionPointContainer_iface; |
| LONG ref; |
| IOleClientSite *site; |
| SIZEL extent; |
| LONG timeout; |
| |
| /* connection points */ |
| ConnectionPoint *cp_list; |
| ConnectionPoint cp_scsource; |
| ConnectionPoint cp_propnotif; |
| |
| /* IViewObject sink */ |
| IAdviseSink *view_sink; |
| DWORD view_sink_flags; |
| |
| ScriptHost *host; |
| }; |
| |
| static HINSTANCE msscript_instance; |
| |
| static inline void * __WINE_ALLOC_SIZE(1) heap_alloc(size_t len) |
| { |
| return HeapAlloc(GetProcessHeap(), 0, len); |
| } |
| |
| static inline BOOL heap_free(void *mem) |
| { |
| return HeapFree(GetProcessHeap(), 0, mem); |
| } |
| |
| typedef enum tid_t { |
| IScriptControl_tid, |
| LAST_tid |
| } tid_t; |
| |
| static ITypeLib *typelib; |
| static ITypeInfo *typeinfos[LAST_tid]; |
| |
| static REFIID tid_ids[] = { |
| &IID_IScriptControl |
| }; |
| |
| static HRESULT load_typelib(void) |
| { |
| HRESULT hres; |
| ITypeLib *tl; |
| |
| hres = LoadRegTypeLib(&LIBID_MSScriptControl, 1, 0, LOCALE_SYSTEM_DEFAULT, &tl); |
| if(FAILED(hres)) { |
| ERR("LoadRegTypeLib failed: %08x\n", hres); |
| return hres; |
| } |
| |
| if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) |
| ITypeLib_Release(tl); |
| return hres; |
| } |
| |
| static HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo) |
| { |
| HRESULT hres; |
| |
| if (!typelib) |
| hres = load_typelib(); |
| if (!typelib) |
| return hres; |
| |
| if(!typeinfos[tid]) { |
| ITypeInfo *ti; |
| |
| hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti); |
| if(FAILED(hres)) { |
| ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres); |
| return hres; |
| } |
| |
| if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL)) |
| ITypeInfo_Release(ti); |
| } |
| |
| *typeinfo = typeinfos[tid]; |
| ITypeInfo_AddRef(typeinfos[tid]); |
| return S_OK; |
| } |
| |
| static void release_typelib(void) |
| { |
| unsigned i; |
| |
| if(!typelib) |
| return; |
| |
| for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) |
| if(typeinfos[i]) |
| ITypeInfo_Release(typeinfos[i]); |
| |
| ITypeLib_Release(typelib); |
| } |
| |
| static void clear_named_items(ScriptHost *host) |
| { |
| struct named_item *item, *item1; |
| LIST_FOR_EACH_ENTRY_SAFE(item, item1, &host->named_items, struct named_item, entry) { |
| list_remove(&item->entry); |
| SysFreeString(item->name); |
| IDispatch_Release(item->disp); |
| heap_free(item); |
| } |
| } |
| |
| static struct named_item *host_get_named_item(ScriptHost *host, const WCHAR *nameW) |
| { |
| struct named_item *item; |
| |
| LIST_FOR_EACH_ENTRY(item, &host->named_items, struct named_item, entry) { |
| if (!lstrcmpW(item->name, nameW)) |
| return item; |
| } |
| |
| return NULL; |
| } |
| |
| static inline ScriptControl *impl_from_IScriptControl(IScriptControl *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptControl, IScriptControl_iface); |
| } |
| |
| static inline ScriptControl *impl_from_IOleObject(IOleObject *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptControl, IOleObject_iface); |
| } |
| |
| static inline ScriptControl *impl_from_IPersistStreamInit(IPersistStreamInit *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptControl, IPersistStreamInit_iface); |
| } |
| |
| static inline ScriptControl *impl_from_IOleControl(IOleControl *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptControl, IOleControl_iface); |
| } |
| |
| static inline ScriptControl *impl_from_IQuickActivate(IQuickActivate *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptControl, IQuickActivate_iface); |
| } |
| |
| static inline ScriptControl *impl_from_IViewObjectEx(IViewObjectEx *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptControl, IViewObjectEx_iface); |
| } |
| |
| static inline ScriptControl *impl_from_IPointerInactive(IPointerInactive *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptControl, IPointerInactive_iface); |
| } |
| |
| static inline ScriptControl *impl_from_IConnectionPointContainer(IConnectionPointContainer *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptControl, IConnectionPointContainer_iface); |
| } |
| |
| static inline ConnectionPoint *impl_from_IConnectionPoint(IConnectionPoint *iface) |
| { |
| return CONTAINING_RECORD(iface, ConnectionPoint, IConnectionPoint_iface); |
| } |
| |
| static inline ScriptHost *impl_from_IActiveScriptSite(IActiveScriptSite *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptHost, IActiveScriptSite_iface); |
| } |
| |
| static inline ScriptHost *impl_from_IActiveScriptSiteWindow(IActiveScriptSiteWindow *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptHost, IActiveScriptSiteWindow_iface); |
| } |
| |
| static inline ScriptHost *impl_from_IServiceProvider(IServiceProvider *iface) |
| { |
| return CONTAINING_RECORD(iface, ScriptHost, IServiceProvider_iface); |
| } |
| |
| /* IActiveScriptSite */ |
| static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| |
| if(IsEqualGUID(&IID_IUnknown, riid)) { |
| TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); |
| *ppv = &This->IActiveScriptSite_iface; |
| }else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) { |
| TRACE("(%p)->(IID_IActiveScriptSite %p)\n", This, ppv); |
| *ppv = &This->IActiveScriptSite_iface; |
| }else if(IsEqualGUID(&IID_IActiveScriptSiteWindow, riid)) { |
| TRACE("(%p)->(IID_IActiveScriptSiteWindow %p)\n", This, ppv); |
| *ppv = &This->IActiveScriptSiteWindow_iface; |
| }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { |
| TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); |
| *ppv = &This->IServiceProvider_iface; |
| }else { |
| FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); |
| *ppv = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| LONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p) ref=%d\n", This, ref); |
| |
| return ref; |
| } |
| |
| static void release_script_engine(ScriptHost *host) |
| { |
| if (host->script) { |
| IActiveScript_Close(host->script); |
| IActiveScript_Release(host->script); |
| } |
| |
| if (host->parse) |
| IActiveScriptParse_Release(host->parse); |
| |
| host->parse = NULL; |
| host->script = NULL; |
| |
| IActiveScriptSite_Release(&host->IActiveScriptSite_iface); |
| } |
| |
| static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| LONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p) ref=%d\n", This, ref); |
| |
| if(!ref) { |
| clear_named_items(This); |
| heap_free(This); |
| } |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *lcid) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| |
| TRACE("(%p, %p)\n", This, lcid); |
| |
| *lcid = GetUserDefaultLCID(); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR name, DWORD mask, |
| IUnknown **unk, ITypeInfo **ti) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| struct named_item *item; |
| |
| TRACE("(%p, %s, %#x, %p, %p)\n", This, debugstr_w(name), mask, unk, ti); |
| |
| item = host_get_named_item(This, name); |
| if (!item) |
| return TYPE_E_ELEMENTNOTFOUND; |
| |
| if (mask != SCRIPTINFO_IUNKNOWN) { |
| FIXME("mask %#x is not supported\n", mask); |
| return E_NOTIMPL; |
| } |
| |
| *unk = (IUnknown*)item->disp; |
| IUnknown_AddRef(*unk); |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *version) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| |
| FIXME("(%p, %p)\n", This, version); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, const VARIANT *result, |
| const EXCEPINFO *ei) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| |
| FIXME("(%p, %s, %p)\n", This, debugstr_variant(result), ei); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE state) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| |
| FIXME("(%p, %d)\n", This, state); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *script_error) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| |
| FIXME("(%p, %p)\n", This, script_error); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| |
| FIXME("(%p)\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSite(iface); |
| |
| FIXME("(%p)\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = { |
| ActiveScriptSite_QueryInterface, |
| ActiveScriptSite_AddRef, |
| ActiveScriptSite_Release, |
| ActiveScriptSite_GetLCID, |
| ActiveScriptSite_GetItemInfo, |
| ActiveScriptSite_GetDocVersionString, |
| ActiveScriptSite_OnScriptTerminate, |
| ActiveScriptSite_OnStateChange, |
| ActiveScriptSite_OnScriptError, |
| ActiveScriptSite_OnEnterScript, |
| ActiveScriptSite_OnLeaveScript |
| }; |
| |
| /* IActiveScriptSiteWindow */ |
| static HRESULT WINAPI ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow *iface, REFIID riid, void **obj) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface); |
| return IActiveScriptSite_QueryInterface(&This->IActiveScriptSite_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow *iface) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface); |
| return IActiveScriptSite_AddRef(&This->IActiveScriptSite_iface); |
| } |
| |
| static ULONG WINAPI ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow *iface) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface); |
| return IActiveScriptSite_Release(&This->IActiveScriptSite_iface); |
| } |
| |
| static HRESULT WINAPI ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow *iface, HWND *hwnd) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface); |
| |
| FIXME("(%p, %p)\n", This, hwnd); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL enable) |
| { |
| ScriptHost *This = impl_from_IActiveScriptSiteWindow(iface); |
| |
| FIXME("(%p, %d)\n", This, enable); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = { |
| ActiveScriptSiteWindow_QueryInterface, |
| ActiveScriptSiteWindow_AddRef, |
| ActiveScriptSiteWindow_Release, |
| ActiveScriptSiteWindow_GetWindow, |
| ActiveScriptSiteWindow_EnableModeless |
| }; |
| |
| /* IServiceProvider */ |
| static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **obj) |
| { |
| ScriptHost *This = impl_from_IServiceProvider(iface); |
| return IActiveScriptSite_QueryInterface(&This->IActiveScriptSite_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface) |
| { |
| ScriptHost *This = impl_from_IServiceProvider(iface); |
| return IActiveScriptSite_AddRef(&This->IActiveScriptSite_iface); |
| } |
| |
| static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface) |
| { |
| ScriptHost *This = impl_from_IServiceProvider(iface); |
| return IActiveScriptSite_Release(&This->IActiveScriptSite_iface); |
| } |
| |
| static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID service, |
| REFIID riid, void **obj) |
| { |
| ScriptHost *This = impl_from_IServiceProvider(iface); |
| |
| FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(service), debugstr_guid(riid), obj); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IServiceProviderVtbl ServiceProviderVtbl = { |
| ServiceProvider_QueryInterface, |
| ServiceProvider_AddRef, |
| ServiceProvider_Release, |
| ServiceProvider_QueryService |
| }; |
| |
| static HRESULT init_script_host(const CLSID *clsid, ScriptHost **ret) |
| { |
| IObjectSafety *objsafety; |
| ScriptHost *host; |
| HRESULT hr; |
| |
| *ret = NULL; |
| |
| host = heap_alloc(sizeof(*host)); |
| if (!host) |
| return E_OUTOFMEMORY; |
| |
| host->IActiveScriptSite_iface.lpVtbl = &ActiveScriptSiteVtbl; |
| host->IActiveScriptSiteWindow_iface.lpVtbl = &ActiveScriptSiteWindowVtbl; |
| host->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl; |
| host->ref = 1; |
| host->script = NULL; |
| host->parse = NULL; |
| host->clsid = *clsid; |
| list_init(&host->named_items); |
| |
| hr = CoCreateInstance(&host->clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IActiveScript, (void**)&host->script); |
| if (FAILED(hr)) { |
| WARN("Failed to create an instance for %s, %#x\n", debugstr_guid(clsid), hr); |
| goto failed; |
| } |
| |
| hr = IActiveScript_QueryInterface(host->script, &IID_IObjectSafety, (void**)&objsafety); |
| if (FAILED(hr)) { |
| FIXME("Could not get IObjectSafety, %#x\n", hr); |
| goto failed; |
| } |
| |
| hr = IObjectSafety_SetInterfaceSafetyOptions(objsafety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA, 0); |
| IObjectSafety_Release(objsafety); |
| if (FAILED(hr)) { |
| FIXME("SetInterfaceSafetyOptions failed, %#x\n", hr); |
| goto failed; |
| } |
| |
| hr = IActiveScript_SetScriptSite(host->script, &host->IActiveScriptSite_iface); |
| if (FAILED(hr)) { |
| WARN("SetScriptSite failed, %#x\n", hr); |
| goto failed; |
| } |
| |
| hr = IActiveScript_QueryInterface(host->script, &IID_IActiveScriptParse, (void**)&host->parse); |
| if (FAILED(hr)) { |
| WARN("Failed to get IActiveScriptParse, %#x\n", hr); |
| goto failed; |
| } |
| |
| hr = IActiveScriptParse_InitNew(host->parse); |
| if (FAILED(hr)) { |
| WARN("InitNew failed, %#x\n", hr); |
| goto failed; |
| } |
| |
| *ret = host; |
| return S_OK; |
| |
| failed: |
| release_script_engine(host); |
| return hr; |
| } |
| |
| static HRESULT WINAPI ScriptControl_QueryInterface(IScriptControl *iface, REFIID riid, void **ppv) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| |
| if(IsEqualGUID(&IID_IUnknown, riid)) { |
| TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); |
| *ppv = &This->IScriptControl_iface; |
| }else if(IsEqualGUID(&IID_IDispatch, riid)) { |
| TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); |
| *ppv = &This->IScriptControl_iface; |
| }else if(IsEqualGUID(&IID_IScriptControl, riid)) { |
| TRACE("(%p)->(IID_IScriptControl %p)\n", This, ppv); |
| *ppv = &This->IScriptControl_iface; |
| }else if(IsEqualGUID(&IID_IOleObject, riid)) { |
| TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv); |
| *ppv = &This->IOleObject_iface; |
| }else if(IsEqualGUID(&IID_IPersistStreamInit, riid)) { |
| TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv); |
| *ppv = &This->IPersistStreamInit_iface; |
| }else if(IsEqualGUID(&IID_IPersist, riid)) { |
| TRACE("(%p)->(IID_IPersist %p)\n", This, ppv); |
| *ppv = &This->IPersistStreamInit_iface; |
| }else if(IsEqualGUID(&IID_IOleControl, riid)) { |
| TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv); |
| *ppv = &This->IOleControl_iface; |
| }else if(IsEqualGUID(&IID_IQuickActivate, riid)) { |
| TRACE("(%p)->(IID_IQuickActivate %p)\n", This, ppv); |
| *ppv = &This->IQuickActivate_iface; |
| }else if(IsEqualGUID(&IID_IViewObject, riid)) { |
| TRACE("(%p)->(IID_IViewObject %p)\n", This, ppv); |
| *ppv = &This->IViewObjectEx_iface; |
| }else if(IsEqualGUID(&IID_IViewObject2, riid)) { |
| TRACE("(%p)->(IID_IViewObject2 %p)\n", This, ppv); |
| *ppv = &This->IViewObjectEx_iface; |
| }else if(IsEqualGUID(&IID_IViewObjectEx, riid)) { |
| TRACE("(%p)->(IID_IViewObjectEx %p)\n", This, ppv); |
| *ppv = &This->IViewObjectEx_iface; |
| }else if(IsEqualGUID(&IID_IPointerInactive, riid)) { |
| TRACE("(%p)->(IID_IPointerInactive %p)\n", This, ppv); |
| *ppv = &This->IPointerInactive_iface; |
| }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) { |
| TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv); |
| *ppv = &This->IConnectionPointContainer_iface; |
| }else { |
| FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); |
| *ppv = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI ScriptControl_AddRef(IScriptControl *iface) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| LONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p) ref=%d\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI ScriptControl_Release(IScriptControl *iface) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| LONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p) ref=%d\n", This, ref); |
| |
| if(!ref) { |
| if (This->site) |
| IOleClientSite_Release(This->site); |
| if (This->host) |
| release_script_engine(This->host); |
| heap_free(This); |
| } |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI ScriptControl_GetTypeInfoCount(IScriptControl *iface, UINT *pctinfo) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| TRACE("(%p)->(%p)\n", This, pctinfo); |
| *pctinfo = 1; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ScriptControl_GetTypeInfo(IScriptControl *iface, UINT iTInfo, |
| LCID lcid, ITypeInfo **ppTInfo) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); |
| return get_typeinfo(IScriptControl_tid, ppTInfo); |
| } |
| |
| static HRESULT WINAPI ScriptControl_GetIDsOfNames(IScriptControl *iface, REFIID riid, |
| LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| ITypeInfo *typeinfo; |
| HRESULT hres; |
| |
| TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); |
| |
| hres = get_typeinfo(IScriptControl_tid, &typeinfo); |
| if(SUCCEEDED(hres)) { |
| hres = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId); |
| ITypeInfo_Release(typeinfo); |
| } |
| |
| return hres; |
| } |
| |
| static HRESULT WINAPI ScriptControl_Invoke(IScriptControl *iface, DISPID dispIdMember, |
| REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, |
| EXCEPINFO *pExcepInfo, UINT *puArgErr) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| ITypeInfo *typeinfo; |
| HRESULT hres; |
| |
| TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), |
| lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); |
| |
| hres = get_typeinfo(IScriptControl_tid, &typeinfo); |
| if(SUCCEEDED(hres)) { |
| hres = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags, |
| pDispParams, pVarResult, pExcepInfo, puArgErr); |
| ITypeInfo_Release(typeinfo); |
| } |
| |
| return hres; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_Language(IScriptControl *iface, BSTR *p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| LPOLESTR progidW; |
| HRESULT hr; |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| if (!p) |
| return E_POINTER; |
| |
| *p = NULL; |
| |
| if (!This->host) |
| return S_OK; |
| |
| hr = ProgIDFromCLSID(&This->host->clsid, &progidW); |
| if (FAILED(hr)) |
| return hr; |
| |
| *p = SysAllocString(progidW); |
| CoTaskMemFree(progidW); |
| return *p ? S_OK : E_OUTOFMEMORY; |
| } |
| |
| static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR language) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| CLSID clsid; |
| |
| TRACE("(%p)->(%s)\n", This, debugstr_w(language)); |
| |
| if (language && FAILED(CLSIDFromProgID(language, &clsid))) |
| return CTL_E_INVALIDPROPERTYVALUE; |
| |
| if (This->host) { |
| release_script_engine(This->host); |
| This->host = NULL; |
| } |
| |
| if (!language) |
| return S_OK; |
| |
| return init_script_host(&clsid, &This->host); |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_State(IScriptControl *iface, ScriptControlStates *p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_put_State(IScriptControl *iface, ScriptControlStates state) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%x)\n", This, state); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_put_SitehWnd(IScriptControl *iface, LONG hwnd) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%x)\n", This, hwnd); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_SitehWnd(IScriptControl *iface, LONG *p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_Timeout(IScriptControl *iface, LONG *p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| if (!p) |
| return E_POINTER; |
| |
| *p = This->timeout; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ScriptControl_put_Timeout(IScriptControl *iface, LONG timeout) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| |
| TRACE("(%p)->(%d)\n", This, timeout); |
| |
| if (timeout < -1) |
| return CTL_E_INVALIDPROPERTYVALUE; |
| |
| if (timeout != -1) |
| FIXME("execution timeout ignored\n"); |
| |
| This->timeout = timeout; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_AllowUI(IScriptControl *iface, VARIANT_BOOL *p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_put_AllowUI(IScriptControl *iface, VARIANT_BOOL allow_ui) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%x)\n", This, allow_ui); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_UseSafeSubset(IScriptControl *iface, VARIANT_BOOL *p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_put_UseSafeSubset(IScriptControl *iface, VARIANT_BOOL v) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%x)\n", This, v); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_Modules(IScriptControl *iface, IScriptModuleCollection **p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_Error(IScriptControl *iface, IScriptError **p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_CodeObject(IScriptControl *iface, IDispatch **p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_get_Procedures(IScriptControl *iface, IScriptProcedureCollection **p) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl__AboutBox(IScriptControl *iface) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)\n", This); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_AddObject(IScriptControl *iface, BSTR name, IDispatch *object, VARIANT_BOOL add_members) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| DWORD flags = SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE; |
| struct named_item *item; |
| HRESULT hr; |
| |
| TRACE("(%p)->(%s %p %x)\n", This, debugstr_w(name), object, add_members); |
| |
| if (!object) |
| return E_INVALIDARG; |
| |
| if (!This->host) |
| return E_FAIL; |
| |
| if (host_get_named_item(This->host, name)) |
| return E_INVALIDARG; |
| |
| item = heap_alloc(sizeof(*item)); |
| if (!item) |
| return E_OUTOFMEMORY; |
| |
| item->name = SysAllocString(name); |
| IDispatch_AddRef(item->disp = object); |
| list_add_tail(&This->host->named_items, &item->entry); |
| |
| if (add_members) |
| flags |= SCRIPTITEM_GLOBALMEMBERS; |
| hr = IActiveScript_AddNamedItem(This->host->script, name, flags); |
| if (FAILED(hr)) { |
| list_remove(&item->entry); |
| IDispatch_Release(item->disp); |
| SysFreeString(item->name); |
| heap_free(item); |
| return hr; |
| } |
| |
| |
| return hr; |
| } |
| |
| static HRESULT WINAPI ScriptControl_Reset(IScriptControl *iface) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| |
| TRACE("(%p)\n", This); |
| |
| if (!This->host) |
| return E_FAIL; |
| |
| clear_named_items(This->host); |
| return IActiveScript_SetScriptState(This->host->script, SCRIPTSTATE_INITIALIZED); |
| } |
| |
| static HRESULT WINAPI ScriptControl_AddCode(IScriptControl *iface, BSTR code) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(code)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_Eval(IScriptControl *iface, BSTR expression, VARIANT *res) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%s %p)\n", This, debugstr_w(expression), res); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_ExecuteStatement(IScriptControl *iface, BSTR statement) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(statement)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ScriptControl_Run(IScriptControl *iface, BSTR procedure_name, SAFEARRAY **parameters, VARIANT *res) |
| { |
| ScriptControl *This = impl_from_IScriptControl(iface); |
| FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(procedure_name), parameters, res); |
| return E_NOTIMPL; |
| } |
| |
| static const IScriptControlVtbl ScriptControlVtbl = { |
| ScriptControl_QueryInterface, |
| ScriptControl_AddRef, |
| ScriptControl_Release, |
| ScriptControl_GetTypeInfoCount, |
| ScriptControl_GetTypeInfo, |
| ScriptControl_GetIDsOfNames, |
| ScriptControl_Invoke, |
| ScriptControl_get_Language, |
| ScriptControl_put_Language, |
| ScriptControl_get_State, |
| ScriptControl_put_State, |
| ScriptControl_put_SitehWnd, |
| ScriptControl_get_SitehWnd, |
| ScriptControl_get_Timeout, |
| ScriptControl_put_Timeout, |
| ScriptControl_get_AllowUI, |
| ScriptControl_put_AllowUI, |
| ScriptControl_get_UseSafeSubset, |
| ScriptControl_put_UseSafeSubset, |
| ScriptControl_get_Modules, |
| ScriptControl_get_Error, |
| ScriptControl_get_CodeObject, |
| ScriptControl_get_Procedures, |
| ScriptControl__AboutBox, |
| ScriptControl_AddObject, |
| ScriptControl_Reset, |
| ScriptControl_AddCode, |
| ScriptControl_Eval, |
| ScriptControl_ExecuteStatement, |
| ScriptControl_Run |
| }; |
| |
| static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **obj) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI OleObject_AddRef(IOleObject *iface) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| return IScriptControl_AddRef(&This->IScriptControl_iface); |
| } |
| |
| static ULONG WINAPI OleObject_Release(IOleObject *iface) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| return IScriptControl_Release(&This->IScriptControl_iface); |
| } |
| |
| static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *site) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| TRACE("(%p)->(%p)\n", This, site); |
| |
| if (This->site) |
| IOleClientSite_Release(This->site); |
| |
| if ((This->site = site)) |
| IOleClientSite_AddRef(site); |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **site) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| TRACE("(%p)->(%p)\n", This, site); |
| |
| if (!site) |
| return E_POINTER; |
| |
| if ((*site = This->site)) |
| IOleClientSite_AddRef(*site); |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR containerapp, LPCOLESTR containerobj) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%s %s)\n", This, debugstr_w(containerapp), debugstr_w(containerobj)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD save) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%d)\n", This, save); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD which, IMoniker *moniker) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%d %p)\n", This, which, moniker); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD assign, DWORD which, IMoniker **moniker) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%d %d %p)\n", This, assign, which, moniker); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *dataobj, BOOL creation, |
| DWORD reserved) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%p %d %d)\n", This, dataobj, creation, reserved); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD reserved, IDataObject **dataobj) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%d %p)\n", This, reserved, dataobj); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG verb, LPMSG msg, IOleClientSite *active_site, |
| LONG index, HWND hwndParent, LPCRECT rect) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%d %p %p %d %p %p)\n", This, verb, msg, active_site, index, hwndParent, rect); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **enumoleverb) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%p)\n", This, enumoleverb); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_Update(IOleObject *iface) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *clsid) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%p)\n", This, clsid); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD form_of_type, LPOLESTR *usertype) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%d %p)\n", This, form_of_type, usertype); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD aspect, SIZEL *size) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%d %p)\n", This, aspect, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD aspect, SIZEL *size) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| TRACE("(%p)->(%d %p)\n", This, aspect, size); |
| |
| if (aspect != DVASPECT_CONTENT) |
| return DV_E_DVASPECT; |
| |
| *size = This->extent; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *sink, DWORD *connection) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%p %p)\n", This, sink, connection); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD connection) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%d)\n", This, connection); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **enumadvise) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%p)\n", This, enumadvise); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD aspect, DWORD *status) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| TRACE("(%p)->(%d %p)\n", This, aspect, status); |
| |
| return OleRegGetMiscStatus(&CLSID_ScriptControl, aspect, status); |
| } |
| |
| static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *logpal) |
| { |
| ScriptControl *This = impl_from_IOleObject(iface); |
| |
| FIXME("(%p)->(%p)\n", This, logpal); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IOleObjectVtbl OleObjectVtbl = { |
| OleObject_QueryInterface, |
| OleObject_AddRef, |
| OleObject_Release, |
| OleObject_SetClientSite, |
| OleObject_GetClientSite, |
| OleObject_SetHostNames, |
| OleObject_Close, |
| OleObject_SetMoniker, |
| OleObject_GetMoniker, |
| OleObject_InitFromData, |
| OleObject_GetClipboardData, |
| OleObject_DoVerb, |
| OleObject_EnumVerbs, |
| OleObject_Update, |
| OleObject_IsUpToDate, |
| OleObject_GetUserClassID, |
| OleObject_GetUserType, |
| OleObject_SetExtent, |
| OleObject_GetExtent, |
| OleObject_Advise, |
| OleObject_Unadvise, |
| OleObject_EnumAdvise, |
| OleObject_GetMiscStatus, |
| OleObject_SetColorScheme |
| }; |
| |
| static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface, REFIID riid, void **obj) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| return IScriptControl_AddRef(&This->IScriptControl_iface); |
| } |
| |
| static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| return IScriptControl_Release(&This->IScriptControl_iface); |
| } |
| |
| static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *clsid) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| |
| FIXME("(%p)->(%p)\n", This, clsid); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| |
| FIXME("(%p)\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| |
| FIXME("(%p)->(%p)\n", This, stream); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, IStream *stream, BOOL clear_dirty) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| |
| FIXME("(%p)->(%p %d)\n", This, stream, clear_dirty); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface, ULARGE_INTEGER *size) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| |
| FIXME("(%p)->(%p)\n", This, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface) |
| { |
| ScriptControl *This = impl_from_IPersistStreamInit(iface); |
| |
| FIXME("(%p)\n", This); |
| |
| return S_OK; |
| } |
| |
| static const IPersistStreamInitVtbl PersistStreamInitVtbl = { |
| PersistStreamInit_QueryInterface, |
| PersistStreamInit_AddRef, |
| PersistStreamInit_Release, |
| PersistStreamInit_GetClassID, |
| PersistStreamInit_IsDirty, |
| PersistStreamInit_Load, |
| PersistStreamInit_Save, |
| PersistStreamInit_GetSizeMax, |
| PersistStreamInit_InitNew |
| }; |
| |
| static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **obj) |
| { |
| ScriptControl *This = impl_from_IOleControl(iface); |
| return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI OleControl_AddRef(IOleControl *iface) |
| { |
| ScriptControl *This = impl_from_IOleControl(iface); |
| return IScriptControl_AddRef(&This->IScriptControl_iface); |
| } |
| |
| static ULONG WINAPI OleControl_Release(IOleControl *iface) |
| { |
| ScriptControl *This = impl_from_IOleControl(iface); |
| return IScriptControl_Release(&This->IScriptControl_iface); |
| } |
| |
| static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *info) |
| { |
| ScriptControl *This = impl_from_IOleControl(iface); |
| |
| TRACE("(%p)->(%p)\n", This, info); |
| |
| if (!info) |
| return E_POINTER; |
| |
| info->hAccel = NULL; |
| info->cAccel = 0; |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg) |
| { |
| ScriptControl *This = impl_from_IOleControl(iface); |
| |
| FIXME("(%p)->(%p)\n", This, msg); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispid) |
| { |
| ScriptControl *This = impl_from_IOleControl(iface); |
| |
| FIXME("(%p)->(%#x)\n", This, dispid); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze) |
| { |
| ScriptControl *This = impl_from_IOleControl(iface); |
| |
| FIXME("(%p)->(%d)\n", This, freeze); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IOleControlVtbl OleControlVtbl = { |
| OleControl_QueryInterface, |
| OleControl_AddRef, |
| OleControl_Release, |
| OleControl_GetControlInfo, |
| OleControl_OnMnemonic, |
| OleControl_OnAmbientPropertyChange, |
| OleControl_FreezeEvents |
| }; |
| |
| static HRESULT WINAPI QuickActivate_QueryInterface(IQuickActivate *iface, REFIID riid, void **obj) |
| { |
| ScriptControl *This = impl_from_IQuickActivate(iface); |
| return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI QuickActivate_AddRef(IQuickActivate *iface) |
| { |
| ScriptControl *This = impl_from_IQuickActivate(iface); |
| return IScriptControl_AddRef(&This->IScriptControl_iface); |
| } |
| |
| static ULONG WINAPI QuickActivate_Release(IQuickActivate *iface) |
| { |
| ScriptControl *This = impl_from_IQuickActivate(iface); |
| return IScriptControl_Release(&This->IScriptControl_iface); |
| } |
| |
| static HRESULT WINAPI QuickActivate_QuickActivate(IQuickActivate *iface, QACONTAINER *container, QACONTROL *control) |
| { |
| ScriptControl *This = impl_from_IQuickActivate(iface); |
| |
| FIXME("(%p)->(%p %p)\n", This, container, control); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI QuickActivate_SetContentExtent(IQuickActivate *iface, SIZEL *size) |
| { |
| ScriptControl *This = impl_from_IQuickActivate(iface); |
| |
| FIXME("(%p)->(%p)\n", This, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI QuickActivate_GetContentExtent(IQuickActivate *iface, SIZEL *size) |
| { |
| ScriptControl *This = impl_from_IQuickActivate(iface); |
| |
| FIXME("(%p)->(%p)\n", This, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IQuickActivateVtbl QuickActivateVtbl = { |
| QuickActivate_QueryInterface, |
| QuickActivate_AddRef, |
| QuickActivate_Release, |
| QuickActivate_QuickActivate, |
| QuickActivate_SetContentExtent, |
| QuickActivate_GetContentExtent |
| }; |
| |
| static HRESULT WINAPI ViewObject_QueryInterface(IViewObjectEx *iface, REFIID riid, void **obj) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI ViewObject_AddRef(IViewObjectEx *iface) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| return IScriptControl_AddRef(&This->IScriptControl_iface); |
| } |
| |
| static ULONG WINAPI ViewObject_Release(IViewObjectEx *iface) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| return IScriptControl_Release(&This->IScriptControl_iface); |
| } |
| |
| static HRESULT WINAPI ViewObject_Draw(IViewObjectEx *iface, DWORD drawaspect, LONG index, void *aspect, |
| DVTARGETDEVICE *device, HDC target_dev, HDC hdc_draw, const RECTL *bounds, const RECTL *win_bounds, |
| BOOL (STDMETHODCALLTYPE *fn_continue)(ULONG_PTR cont), ULONG_PTR cont) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d %d %p %p %p %p %p %p %p %lu)\n", This, drawaspect, index, aspect, device, target_dev, |
| hdc_draw, bounds, win_bounds, fn_continue, cont); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ViewObject_GetColorSet(IViewObjectEx *iface, DWORD drawaspect, LONG index, void *aspect, |
| DVTARGETDEVICE *device, HDC hic_target, LOGPALETTE **colorset) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d %d %p %p %p %p)\n", This, drawaspect, index, aspect, device, hic_target, |
| colorset); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ViewObject_Freeze(IViewObjectEx *iface, DWORD drawaspect, LONG index, void *aspect, |
| DWORD *freeze) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d %d %p %p)\n", This, drawaspect, index, aspect, freeze); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ViewObject_Unfreeze(IViewObjectEx *iface, DWORD freeze) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d)\n", This, freeze); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, DWORD flags, IAdviseSink *sink) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| TRACE("(%p)->(%d %#x %p)\n", This, aspects, flags, sink); |
| |
| if (aspects != DVASPECT_CONTENT) |
| return DV_E_DVASPECT; |
| |
| This->view_sink_flags = flags; |
| if (This->view_sink) |
| IAdviseSink_Release(This->view_sink); |
| This->view_sink = sink; |
| if (This->view_sink) |
| IAdviseSink_AddRef(This->view_sink); |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ViewObject_GetAdvise(IViewObjectEx *iface, DWORD *aspects, DWORD *flags, IAdviseSink **sink) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| TRACE("(%p)->(%p %p %p)\n", This, aspects, flags, sink); |
| |
| if (aspects) |
| *aspects = DVASPECT_CONTENT; |
| if (flags) |
| *flags = This->view_sink_flags; |
| if (sink) { |
| *sink = This->view_sink; |
| if (*sink) |
| IAdviseSink_AddRef(*sink); |
| } |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ViewObject_GetExtent(IViewObjectEx *iface, DWORD draw_aspect, LONG index, |
| DVTARGETDEVICE *device, SIZEL *size) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d %d %p %p)\n", This, draw_aspect, index, device, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ViewObject_GetRect(IViewObjectEx *iface, DWORD aspect, RECTL *rect) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d %p)\n", This, aspect, rect); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ViewObject_GetViewStatus(IViewObjectEx *iface, DWORD *status) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| TRACE("(%p)->(%p)\n", This, status); |
| |
| *status = VIEWSTATUS_OPAQUE; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ViewObject_QueryHitPoint(IViewObjectEx *iface, DWORD aspect, const RECT *bounds, |
| POINT pt, LONG close_hint, DWORD *hit_result) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d %s %s %d %p)\n", This, aspect, wine_dbgstr_rect(bounds), wine_dbgstr_point(&pt), close_hint, hit_result); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ViewObject_QueryHitRect(IViewObjectEx *iface, DWORD aspect, const RECT *bounds, |
| const RECT *loc, LONG close_hint, DWORD *hit_result) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d %s %s %d %p)\n", This, aspect, wine_dbgstr_rect(bounds), wine_dbgstr_rect(loc), close_hint, hit_result); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ViewObject_GetNaturalExtent(IViewObjectEx *iface, DWORD aspect, LONG index, |
| DVTARGETDEVICE *device, HDC target_hdc, DVEXTENTINFO *extent_info, SIZEL *size) |
| { |
| ScriptControl *This = impl_from_IViewObjectEx(iface); |
| |
| FIXME("(%p)->(%d %d %p %p %p %p)\n", This, aspect, index, device, target_hdc, extent_info, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IViewObjectExVtbl ViewObjectExVtbl = { |
| ViewObject_QueryInterface, |
| ViewObject_AddRef, |
| ViewObject_Release, |
| ViewObject_Draw, |
| ViewObject_GetColorSet, |
| ViewObject_Freeze, |
| ViewObject_Unfreeze, |
| ViewObject_SetAdvise, |
| ViewObject_GetAdvise, |
| ViewObject_GetExtent, |
| ViewObject_GetRect, |
| ViewObject_GetViewStatus, |
| ViewObject_QueryHitPoint, |
| ViewObject_QueryHitRect, |
| ViewObject_GetNaturalExtent |
| }; |
| |
| static HRESULT WINAPI PointerInactive_QueryInterface(IPointerInactive *iface, REFIID riid, void **obj) |
| { |
| ScriptControl *This = impl_from_IPointerInactive(iface); |
| return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI PointerInactive_AddRef(IPointerInactive *iface) |
| { |
| ScriptControl *This = impl_from_IPointerInactive(iface); |
| return IScriptControl_AddRef(&This->IScriptControl_iface); |
| } |
| |
| static ULONG WINAPI PointerInactive_Release(IPointerInactive *iface) |
| { |
| ScriptControl *This = impl_from_IPointerInactive(iface); |
| return IScriptControl_Release(&This->IScriptControl_iface); |
| } |
| |
| static HRESULT WINAPI PointerInactive_GetActivationPolicy(IPointerInactive *iface, DWORD *policy) |
| { |
| ScriptControl *This = impl_from_IPointerInactive(iface); |
| |
| TRACE("(%p)->(%p)\n", This, policy); |
| |
| if (!policy) |
| return E_POINTER; |
| |
| *policy = 0; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI PointerInactive_OnInactiveMouseMove(IPointerInactive *iface, const RECT *bounds, |
| LONG x, LONG y, DWORD key_state) |
| { |
| ScriptControl *This = impl_from_IPointerInactive(iface); |
| |
| FIXME("(%p)->(%s %d %d %#x)\n", This, wine_dbgstr_rect(bounds), x, y, key_state); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI PointerInactive_OnInactiveSetCursor(IPointerInactive *iface, const RECT *bounds, |
| LONG x, LONG y, DWORD msg, BOOL set_always) |
| { |
| ScriptControl *This = impl_from_IPointerInactive(iface); |
| |
| FIXME("(%p)->(%s %d %d %#x %d)\n", This, wine_dbgstr_rect(bounds), x, y, msg, set_always); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IPointerInactiveVtbl PointerInactiveVtbl = { |
| PointerInactive_QueryInterface, |
| PointerInactive_AddRef, |
| PointerInactive_Release, |
| PointerInactive_GetActivationPolicy, |
| PointerInactive_OnInactiveMouseMove, |
| PointerInactive_OnInactiveSetCursor |
| }; |
| |
| static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, REFIID riid, void **obj) |
| { |
| ScriptControl *This = impl_from_IConnectionPointContainer(iface); |
| return IScriptControl_QueryInterface(&This->IScriptControl_iface, riid, obj); |
| } |
| |
| static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) |
| { |
| ScriptControl *This = impl_from_IConnectionPointContainer(iface); |
| return IScriptControl_AddRef(&This->IScriptControl_iface); |
| } |
| |
| static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface) |
| { |
| ScriptControl *This = impl_from_IConnectionPointContainer(iface); |
| return IScriptControl_Release(&This->IScriptControl_iface); |
| } |
| |
| static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, IEnumConnectionPoints **enum_points) |
| { |
| ScriptControl *This = impl_from_IConnectionPointContainer(iface); |
| |
| FIXME("(%p)->(%p)\n", This, enum_points); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, REFIID riid, IConnectionPoint **cp) |
| { |
| ScriptControl *This = impl_from_IConnectionPointContainer(iface); |
| ConnectionPoint *iter; |
| |
| TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), cp); |
| |
| *cp = NULL; |
| |
| for (iter = This->cp_list; iter; iter = iter->next) { |
| if (IsEqualIID(iter->riid, riid)) |
| *cp = &iter->IConnectionPoint_iface; |
| } |
| |
| if (*cp) { |
| IConnectionPoint_AddRef(*cp); |
| return S_OK; |
| } |
| |
| FIXME("unsupported connection point %s\n", debugstr_guid(riid)); |
| return CONNECT_E_NOCONNECTION; |
| } |
| |
| static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = { |
| ConnectionPointContainer_QueryInterface, |
| ConnectionPointContainer_AddRef, |
| ConnectionPointContainer_Release, |
| ConnectionPointContainer_EnumConnectionPoints, |
| ConnectionPointContainer_FindConnectionPoint |
| }; |
| |
| static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, |
| REFIID riid, void **ppv) |
| { |
| ConnectionPoint *This = impl_from_IConnectionPoint(iface); |
| |
| if(IsEqualGUID(&IID_IUnknown, riid)) { |
| TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); |
| *ppv = &This->IConnectionPoint_iface; |
| }else if(IsEqualGUID(&IID_IConnectionPoint, riid)) { |
| TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); |
| *ppv = &This->IConnectionPoint_iface; |
| }else { |
| FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); |
| *ppv = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface) |
| { |
| ConnectionPoint *This = impl_from_IConnectionPoint(iface); |
| return IConnectionPointContainer_AddRef(&This->control->IConnectionPointContainer_iface); |
| } |
| |
| static ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface) |
| { |
| ConnectionPoint *This = impl_from_IConnectionPoint(iface); |
| return IConnectionPointContainer_Release(&This->control->IConnectionPointContainer_iface); |
| } |
| |
| static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *iid) |
| { |
| ConnectionPoint *This = impl_from_IConnectionPoint(iface); |
| |
| TRACE("(%p)->(%p)\n", This, iid); |
| |
| *iid = *This->riid; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoint *iface, |
| IConnectionPointContainer **container) |
| { |
| ConnectionPoint *This = impl_from_IConnectionPoint(iface); |
| |
| TRACE("(%p)->(%p)\n", This, container); |
| |
| if (!container) |
| return E_POINTER; |
| |
| *container = &This->control->IConnectionPointContainer_iface; |
| IConnectionPointContainer_AddRef(*container); |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *unk_sink, |
| DWORD *cookie) |
| { |
| ConnectionPoint *This = impl_from_IConnectionPoint(iface); |
| |
| FIXME("(%p)->(%p %p)\n", This, unk_sink, cookie); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD cookie) |
| { |
| ConnectionPoint *This = impl_from_IConnectionPoint(iface); |
| |
| FIXME("(%p)->(%d)\n", This, cookie); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface, |
| IEnumConnections **ppEnum) |
| { |
| ConnectionPoint *This = impl_from_IConnectionPoint(iface); |
| |
| FIXME("(%p)->(%p): stub\n", This, ppEnum); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IConnectionPointVtbl ConnectionPointVtbl = |
| { |
| ConnectionPoint_QueryInterface, |
| ConnectionPoint_AddRef, |
| ConnectionPoint_Release, |
| ConnectionPoint_GetConnectionInterface, |
| ConnectionPoint_GetConnectionPointContainer, |
| ConnectionPoint_Advise, |
| ConnectionPoint_Unadvise, |
| ConnectionPoint_EnumConnections |
| }; |
| |
| static void ConnectionPoint_Init(ConnectionPoint *cp, ScriptControl *sc, REFIID riid) |
| { |
| cp->IConnectionPoint_iface.lpVtbl = &ConnectionPointVtbl; |
| cp->control = sc; |
| cp->riid = riid; |
| |
| cp->next = sc->cp_list; |
| sc->cp_list = cp; |
| } |
| |
| static HRESULT WINAPI ScriptControl_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv) |
| { |
| ScriptControl *script_control; |
| DWORD dpi_x, dpi_y; |
| HRESULT hres; |
| HDC hdc; |
| |
| TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); |
| |
| script_control = heap_alloc(sizeof(*script_control)); |
| if(!script_control) |
| return E_OUTOFMEMORY; |
| |
| script_control->IScriptControl_iface.lpVtbl = &ScriptControlVtbl; |
| script_control->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl; |
| script_control->IOleObject_iface.lpVtbl = &OleObjectVtbl; |
| script_control->IOleControl_iface.lpVtbl = &OleControlVtbl; |
| script_control->IQuickActivate_iface.lpVtbl = &QuickActivateVtbl; |
| script_control->IViewObjectEx_iface.lpVtbl = &ViewObjectExVtbl; |
| script_control->IPointerInactive_iface.lpVtbl = &PointerInactiveVtbl; |
| script_control->IConnectionPointContainer_iface.lpVtbl = &ConnectionPointContainerVtbl; |
| script_control->ref = 1; |
| script_control->site = NULL; |
| script_control->cp_list = NULL; |
| script_control->host = NULL; |
| script_control->timeout = 10000; |
| script_control->view_sink_flags = 0; |
| script_control->view_sink = NULL; |
| |
| ConnectionPoint_Init(&script_control->cp_scsource, script_control, &DIID_DScriptControlSource); |
| ConnectionPoint_Init(&script_control->cp_propnotif, script_control, &IID_IPropertyNotifySink); |
| |
| hdc = GetDC(0); |
| dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); |
| dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); |
| ReleaseDC(0, hdc); |
| |
| script_control->extent.cx = MulDiv(38, 2540, dpi_x); |
| script_control->extent.cy = MulDiv(38, 2540, dpi_y); |
| |
| hres = IScriptControl_QueryInterface(&script_control->IScriptControl_iface, riid, ppv); |
| IScriptControl_Release(&script_control->IScriptControl_iface); |
| return hres; |
| } |
| |
| /****************************************************************** |
| * DllMain (msscript.ocx.@) |
| */ |
| BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved) |
| { |
| TRACE("(%p %d %p)\n", instance, reason, reserved); |
| |
| switch(reason) { |
| case DLL_WINE_PREATTACH: |
| return FALSE; /* prefer native version */ |
| case DLL_PROCESS_ATTACH: |
| msscript_instance = instance; |
| DisableThreadLibraryCalls(instance); |
| break; |
| case DLL_PROCESS_DETACH: |
| if(!reserved) |
| release_typelib(); |
| break; |
| } |
| |
| return TRUE; |
| } |
| |
| static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) |
| { |
| *ppv = NULL; |
| |
| if(IsEqualGUID(&IID_IUnknown, riid)) { |
| TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); |
| *ppv = iface; |
| }else if(IsEqualGUID(&IID_IClassFactory, riid)) { |
| TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); |
| *ppv = iface; |
| } |
| |
| if(*ppv) { |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| WARN("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); |
| return E_NOINTERFACE; |
| } |
| |
| static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) |
| { |
| TRACE("(%p)\n", iface); |
| return 2; |
| } |
| |
| static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) |
| { |
| TRACE("(%p)\n", iface); |
| return 1; |
| } |
| |
| static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) |
| { |
| TRACE("(%p)->(%x)\n", iface, fLock); |
| return S_OK; |
| } |
| |
| static const IClassFactoryVtbl ScriptControlFactoryVtbl = { |
| ClassFactory_QueryInterface, |
| ClassFactory_AddRef, |
| ClassFactory_Release, |
| ScriptControl_CreateInstance, |
| ClassFactory_LockServer |
| }; |
| |
| static IClassFactory ScriptControlFactory = { &ScriptControlFactoryVtbl }; |
| |
| /*********************************************************************** |
| * DllGetClassObject (msscript.ocx.@) |
| */ |
| HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) |
| { |
| if(IsEqualGUID(&CLSID_ScriptControl, rclsid)) { |
| TRACE("(CLSID_ScriptControl %s %p)\n", debugstr_guid(riid), ppv); |
| return IClassFactory_QueryInterface(&ScriptControlFactory, riid, ppv); |
| } |
| |
| FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); |
| return CLASS_E_CLASSNOTAVAILABLE; |
| } |
| |
| /*********************************************************************** |
| * DllCanUnloadNow (msscript.ocx.@) |
| */ |
| HRESULT WINAPI DllCanUnloadNow(void) |
| { |
| TRACE("\n"); |
| return S_FALSE; |
| } |
| |
| /*********************************************************************** |
| * DllRegisterServer (msscript.ocx.@) |
| */ |
| HRESULT WINAPI DllRegisterServer(void) |
| { |
| TRACE("()\n"); |
| return __wine_register_resources(msscript_instance); |
| } |
| |
| /*********************************************************************** |
| * DllUnregisterServer (msscript.ocx.@) |
| */ |
| HRESULT WINAPI DllUnregisterServer(void) |
| { |
| TRACE("()\n"); |
| return __wine_unregister_resources(msscript_instance); |
| } |