| /* |
| * Copyright 2016 Nikolay Sivov 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 |
| #define CONST_VTABLE |
| |
| #include <initguid.h> |
| #include <ole2.h> |
| #include <olectl.h> |
| #include "dispex.h" |
| #include "activscp.h" |
| #include "activdbg.h" |
| #include "objsafe.h" |
| |
| #include "msscript.h" |
| #include "wine/test.h" |
| |
| #define TESTSCRIPT_CLSID "{178fc164-f585-4e24-9c13-4bb7faf80746}" |
| static const GUID CLSID_TestScript = |
| {0x178fc164,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}}; |
| static const WCHAR vbW[] = {'V','B','S','c','r','i','p','t',0}; |
| |
| #ifdef _WIN64 |
| |
| #define CTXARG_T DWORDLONG |
| #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl |
| #define IActiveScriptSiteDebug_Release IActiveScriptSiteDebug64_Release |
| |
| #else |
| |
| #define CTXARG_T DWORD |
| #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl |
| #define IActiveScriptSiteDebug_Release IActiveScriptSiteDebug32_Release |
| |
| #endif |
| |
| #define DEFINE_EXPECT(func) \ |
| static BOOL expect_ ## func = FALSE, called_ ## func = FALSE |
| |
| #define SET_EXPECT(func) \ |
| do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0) |
| |
| #define CHECK_EXPECT2(func) \ |
| do { \ |
| ok(expect_ ##func, "unexpected call " #func "\n"); \ |
| called_ ## func = TRUE; \ |
| }while(0) |
| |
| #define CHECK_EXPECT(func) \ |
| do { \ |
| CHECK_EXPECT2(func); \ |
| expect_ ## func = FALSE; \ |
| }while(0) |
| |
| #define CHECK_CALLED(func) \ |
| do { \ |
| ok(called_ ## func, "expected " #func "\n"); \ |
| expect_ ## func = called_ ## func = FALSE; \ |
| }while(0) |
| |
| #define CHECK_CALLED_BROKEN(func) \ |
| do { \ |
| ok(called_ ## func || broken(!called_ ## func), "expected " #func "\n"); \ |
| expect_ ## func = called_ ## func = FALSE; \ |
| }while(0) |
| |
| #define CHECK_NOT_CALLED(func) \ |
| do { \ |
| ok(!called_ ## func, "unexpected " #func "\n"); \ |
| expect_ ## func = called_ ## func = FALSE; \ |
| }while(0) |
| |
| #define CLEAR_CALLED(func) \ |
| expect_ ## func = called_ ## func = FALSE |
| |
| DEFINE_EXPECT(CreateInstance); |
| DEFINE_EXPECT(SetInterfaceSafetyOptions); |
| DEFINE_EXPECT(InitNew); |
| DEFINE_EXPECT(Close); |
| DEFINE_EXPECT(SetScriptSite); |
| DEFINE_EXPECT(QI_IActiveScriptParse); |
| DEFINE_EXPECT(SetScriptState_INITIALIZED); |
| DEFINE_EXPECT(AddNamedItem); |
| |
| #define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__) |
| static void _expect_ref(IUnknown* obj, ULONG ref, int line) |
| { |
| ULONG rc; |
| IUnknown_AddRef(obj); |
| rc = IUnknown_Release(obj); |
| ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc); |
| } |
| |
| static IActiveScriptSite *site; |
| static SCRIPTSTATE state; |
| |
| static HRESULT WINAPI ActiveScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv) |
| { |
| *ppv = NULL; |
| ok(0, "unexpected call\n"); |
| return E_NOINTERFACE; |
| } |
| |
| static ULONG WINAPI ActiveScriptParse_AddRef(IActiveScriptParse *iface) |
| { |
| return 2; |
| } |
| |
| static ULONG WINAPI ActiveScriptParse_Release(IActiveScriptParse *iface) |
| { |
| return 1; |
| } |
| |
| static HRESULT WINAPI ActiveScriptParse_InitNew(IActiveScriptParse *iface) |
| { |
| CHECK_EXPECT(InitNew); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ActiveScriptParse_AddScriptlet(IActiveScriptParse *iface, |
| LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, |
| LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter, |
| CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, |
| BSTR *pbstrName, EXCEPINFO *pexcepinfo) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *iface, |
| LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, |
| LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine, |
| DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static const IActiveScriptParseVtbl ActiveScriptParseVtbl = { |
| ActiveScriptParse_QueryInterface, |
| ActiveScriptParse_AddRef, |
| ActiveScriptParse_Release, |
| ActiveScriptParse_InitNew, |
| ActiveScriptParse_AddScriptlet, |
| ActiveScriptParse_ParseScriptText |
| }; |
| |
| static IActiveScriptParse ActiveScriptParse = { &ActiveScriptParseVtbl }; |
| |
| static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv) |
| { |
| *ppv = NULL; |
| ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); |
| return E_NOINTERFACE; |
| } |
| |
| static ULONG WINAPI ObjectSafety_AddRef(IObjectSafety *iface) |
| { |
| return 2; |
| } |
| |
| static ULONG WINAPI ObjectSafety_Release(IObjectSafety *iface) |
| { |
| return 1; |
| } |
| |
| static HRESULT WINAPI ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid, |
| DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions) |
| { |
| ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid, |
| DWORD mask, DWORD options) |
| { |
| CHECK_EXPECT(SetInterfaceSafetyOptions); |
| |
| ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); |
| |
| ok(mask == INTERFACESAFE_FOR_UNTRUSTED_DATA, "option mask = %x\n", mask); |
| ok(options == 0, "options = %x\n", options); |
| |
| return S_OK; |
| } |
| |
| static const IObjectSafetyVtbl ObjectSafetyVtbl = { |
| ObjectSafety_QueryInterface, |
| ObjectSafety_AddRef, |
| ObjectSafety_Release, |
| ObjectSafety_GetInterfaceSafetyOptions, |
| ObjectSafety_SetInterfaceSafetyOptions |
| }; |
| |
| static IObjectSafety ObjectSafety = { &ObjectSafetyVtbl }; |
| |
| static HRESULT WINAPI ActiveScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv) |
| { |
| *ppv = NULL; |
| |
| if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IActiveScript, riid)) { |
| *ppv = iface; |
| return S_OK; |
| } |
| |
| if(IsEqualGUID(&IID_IObjectSafety, riid)) { |
| *ppv = &ObjectSafety; |
| return S_OK; |
| } |
| |
| if(IsEqualGUID(&IID_IActiveScriptParse, riid)) { |
| CHECK_EXPECT(QI_IActiveScriptParse); |
| *ppv = &ActiveScriptParse; |
| return S_OK; |
| } |
| |
| if(IsEqualGUID(&IID_IActiveScriptGarbageCollector, riid)) |
| return E_NOINTERFACE; |
| |
| ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); |
| return E_NOINTERFACE; |
| } |
| |
| static ULONG WINAPI ActiveScript_AddRef(IActiveScript *iface) |
| { |
| return 2; |
| } |
| |
| static ULONG WINAPI ActiveScript_Release(IActiveScript *iface) |
| { |
| return 1; |
| } |
| |
| static HRESULT WINAPI ActiveScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass) |
| { |
| IActiveScriptSiteInterruptPoll *poll; |
| IActiveScriptSiteWindow *window; |
| IActiveScriptSiteDebug *debug; |
| IServiceProvider *service; |
| ICanHandleException *canexpection; |
| LCID lcid; |
| HRESULT hres; |
| |
| CHECK_EXPECT(SetScriptSite); |
| |
| ok(pass != NULL, "pass == NULL\n"); |
| |
| hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteInterruptPoll, (void**)&poll); |
| ok(hres == E_NOINTERFACE, "Got IActiveScriptSiteInterruptPoll interface: %08x\n", hres); |
| |
| hres = IActiveScriptSite_GetLCID(pass, &lcid); |
| ok(hres == S_OK, "GetLCID failed: %08x\n", hres); |
| |
| hres = IActiveScriptSite_OnStateChange(pass, (state = SCRIPTSTATE_INITIALIZED)); |
| ok(hres == E_NOTIMPL, "OnStateChange failed: %08x\n", hres); |
| |
| hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteDebug, (void**)&debug); |
| ok(hres == E_NOINTERFACE, "Got IActiveScriptSiteDebug interface: %08x\n", hres); |
| |
| hres = IActiveScriptSite_QueryInterface(pass, &IID_ICanHandleException, (void**)&canexpection); |
| ok(hres == E_NOINTERFACE, "Got IID_ICanHandleException interface: %08x\n", hres); |
| |
| hres = IActiveScriptSite_QueryInterface(pass, &IID_IServiceProvider, (void**)&service); |
| ok(hres == S_OK, "Could not get IServiceProvider interface: %08x\n", hres); |
| IServiceProvider_Release(service); |
| |
| hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteWindow, (void**)&window); |
| ok(hres == S_OK, "Could not get IActiveScriptSiteWindow interface: %08x\n", hres); |
| IActiveScriptSiteWindow_Release(window); |
| |
| site = pass; |
| IActiveScriptSite_AddRef(site); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ActiveScript_GetScriptSite(IActiveScript *iface, REFIID riid, |
| void **ppvObject) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss) |
| { |
| if (ss == SCRIPTSTATE_INITIALIZED) { |
| CHECK_EXPECT(SetScriptState_INITIALIZED); |
| return S_OK; |
| } |
| else |
| ok(0, "unexpected call, state %u\n", ss); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_Close(IActiveScript *iface) |
| { |
| CHECK_EXPECT(Close); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_AddNamedItem(IActiveScript *iface, LPCOLESTR name, DWORD flags) |
| { |
| static const WCHAR oW[] = {'o',0}; |
| CHECK_EXPECT(AddNamedItem); |
| ok(!lstrcmpW(name, oW), "got name %s\n", wine_dbgstr_w(name)); |
| ok(flags == (SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS), "got flags %#x\n", flags); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ActiveScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib, |
| DWORD dwMajor, DWORD dwMinor, DWORD dwFlags) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName, |
| IDispatch **ppdisp) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_GetCurrentScriptThreadID(IActiveScript *iface, |
| SCRIPTTHREADID *pstridThread) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_GetScriptThreadID(IActiveScript *iface, |
| DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_GetScriptThreadState(IActiveScript *iface, |
| SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_InterruptScriptThread(IActiveScript *iface, |
| SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ActiveScript_Clone(IActiveScript *iface, IActiveScript **ppscript) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static const IActiveScriptVtbl ActiveScriptVtbl = { |
| ActiveScript_QueryInterface, |
| ActiveScript_AddRef, |
| ActiveScript_Release, |
| ActiveScript_SetScriptSite, |
| ActiveScript_GetScriptSite, |
| ActiveScript_SetScriptState, |
| ActiveScript_GetScriptState, |
| ActiveScript_Close, |
| ActiveScript_AddNamedItem, |
| ActiveScript_AddTypeLib, |
| ActiveScript_GetScriptDispatch, |
| ActiveScript_GetCurrentScriptThreadID, |
| ActiveScript_GetScriptThreadID, |
| ActiveScript_GetScriptThreadState, |
| ActiveScript_InterruptScriptThread, |
| ActiveScript_Clone |
| }; |
| |
| static IActiveScript ActiveScript = { &ActiveScriptVtbl }; |
| |
| static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) |
| { |
| *ppv = NULL; |
| |
| if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) { |
| *ppv = iface; |
| return S_OK; |
| } |
| |
| if(IsEqualGUID(&IID_IMarshal, riid)) |
| return E_NOINTERFACE; |
| |
| ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); |
| return E_NOINTERFACE; |
| } |
| |
| static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) |
| { |
| return 2; |
| } |
| |
| static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) |
| { |
| return 1; |
| } |
| |
| static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv) |
| { |
| CHECK_EXPECT(CreateInstance); |
| |
| ok(!outer, "outer = %p\n", outer); |
| ok(IsEqualGUID(&IID_IActiveScript, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); |
| *ppv = &ActiveScript; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock) |
| { |
| ok(0, "unexpected call\n"); |
| return S_OK; |
| } |
| |
| static const IClassFactoryVtbl ClassFactoryVtbl = { |
| ClassFactory_QueryInterface, |
| ClassFactory_AddRef, |
| ClassFactory_Release, |
| ClassFactory_CreateInstance, |
| ClassFactory_LockServer |
| }; |
| |
| static IClassFactory script_cf = { &ClassFactoryVtbl }; |
| |
| static BOOL init_key(const char *key_name, const char *def_value, BOOL init) |
| { |
| HKEY hkey; |
| DWORD res; |
| |
| if(!init) { |
| RegDeleteKeyA(HKEY_CLASSES_ROOT, key_name); |
| return TRUE; |
| } |
| |
| res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey); |
| if(res != ERROR_SUCCESS) |
| return FALSE; |
| |
| if(def_value) |
| res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value)); |
| |
| RegCloseKey(hkey); |
| |
| return res == ERROR_SUCCESS; |
| } |
| |
| static BOOL init_registry(BOOL init) |
| { |
| return init_key("TestScript\\CLSID", TESTSCRIPT_CLSID, init) |
| && init_key("CLSID\\"TESTSCRIPT_CLSID"\\Implemented Categories\\{F0B7A1A1-9847-11CF-8F20-00805F2CD064}", |
| NULL, init) |
| && init_key("CLSID\\"TESTSCRIPT_CLSID"\\Implemented Categories\\{F0B7A1A2-9847-11CF-8F20-00805F2CD064}", |
| NULL, init); |
| } |
| |
| static BOOL register_script_engine(void) |
| { |
| DWORD regid; |
| HRESULT hres; |
| |
| if(!init_registry(TRUE)) { |
| init_registry(FALSE); |
| return FALSE; |
| } |
| |
| hres = CoRegisterClassObject(&CLSID_TestScript, (IUnknown *)&script_cf, |
| CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®id); |
| ok(hres == S_OK, "Could not register script engine: %08x\n", hres); |
| |
| return TRUE; |
| } |
| |
| static HRESULT WINAPI OleClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **obj) |
| { |
| if (IsEqualIID(riid, &IID_IOleClientSite) || IsEqualIID(riid, &IID_IUnknown)) |
| { |
| *obj = iface; |
| IOleClientSite_AddRef(iface); |
| return S_OK; |
| } |
| |
| *obj = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| static ULONG WINAPI OleClientSite_AddRef(IOleClientSite *iface) |
| { |
| return 2; |
| } |
| |
| static ULONG WINAPI OleClientSite_Release(IOleClientSite *iface) |
| { |
| return 1; |
| } |
| |
| static HRESULT WINAPI OleClientSite_SaveObject(IOleClientSite *iface) |
| { |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleClientSite_GetMoniker(IOleClientSite *iface, DWORD assign, |
| DWORD which, IMoniker **moniker) |
| { |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleClientSite_GetContainer(IOleClientSite *iface, IOleContainer **container) |
| { |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleClientSite_ShowObject(IOleClientSite *iface) |
| { |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleClientSite_OnShowWindow(IOleClientSite *iface, BOOL show) |
| { |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI OleClientSite_RequestNewObjectLayout(IOleClientSite *iface) |
| { |
| return E_NOTIMPL; |
| } |
| |
| static const IOleClientSiteVtbl OleClientSiteVtbl = { |
| OleClientSite_QueryInterface, |
| OleClientSite_AddRef, |
| OleClientSite_Release, |
| OleClientSite_SaveObject, |
| OleClientSite_GetMoniker, |
| OleClientSite_GetContainer, |
| OleClientSite_ShowObject, |
| OleClientSite_OnShowWindow, |
| OleClientSite_RequestNewObjectLayout |
| }; |
| |
| static IOleClientSite testclientsite = { &OleClientSiteVtbl }; |
| |
| static void test_oleobject(void) |
| { |
| DWORD status, dpi_x, dpi_y; |
| IOleClientSite *site; |
| IOleObject *obj; |
| SIZEL extent; |
| HRESULT hr; |
| HDC hdc; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IOleObject, (void**)&obj); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| if (0) /* crashes on w2k3 */ |
| hr = IOleObject_GetMiscStatus(obj, DVASPECT_CONTENT, NULL); |
| |
| status = 0; |
| hr = IOleObject_GetMiscStatus(obj, DVASPECT_CONTENT, &status); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(status != 0, "got 0x%08x\n", status); |
| |
| hr = IOleObject_SetClientSite(obj, &testclientsite); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| if (0) /* crashes on w2k3 */ |
| hr = IOleObject_GetClientSite(obj, NULL); |
| |
| hr = IOleObject_GetClientSite(obj, &site); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(site == &testclientsite, "got %p, %p\n", site, &testclientsite); |
| IOleClientSite_Release(site); |
| |
| hr = IOleObject_SetClientSite(obj, NULL); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IOleObject_GetClientSite(obj, &site); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(site == NULL, "got %p\n", site); |
| |
| /* extents */ |
| hdc = GetDC(0); |
| dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); |
| dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); |
| ReleaseDC(0, hdc); |
| |
| memset(&extent, 0, sizeof(extent)); |
| hr = IOleObject_GetExtent(obj, DVASPECT_CONTENT, &extent); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(extent.cx == MulDiv(38, 2540, dpi_x), "got %d\n", extent.cx); |
| ok(extent.cy == MulDiv(38, 2540, dpi_y), "got %d\n", extent.cy); |
| |
| extent.cx = extent.cy = 0xdeadbeef; |
| hr = IOleObject_GetExtent(obj, DVASPECT_THUMBNAIL, &extent); |
| ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr); |
| ok(extent.cx == 0xdeadbeef, "got %d\n", extent.cx); |
| ok(extent.cy == 0xdeadbeef, "got %d\n", extent.cy); |
| |
| extent.cx = extent.cy = 0xdeadbeef; |
| hr = IOleObject_GetExtent(obj, DVASPECT_ICON, &extent); |
| ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr); |
| ok(extent.cx == 0xdeadbeef, "got %d\n", extent.cx); |
| ok(extent.cy == 0xdeadbeef, "got %d\n", extent.cy); |
| |
| extent.cx = extent.cy = 0xdeadbeef; |
| hr = IOleObject_GetExtent(obj, DVASPECT_DOCPRINT, &extent); |
| ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr); |
| ok(extent.cx == 0xdeadbeef, "got %d\n", extent.cx); |
| ok(extent.cy == 0xdeadbeef, "got %d\n", extent.cy); |
| |
| IOleObject_Release(obj); |
| } |
| |
| static void test_persiststreaminit(void) |
| { |
| IPersistStreamInit *init; |
| HRESULT hr; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IPersistStreamInit, (void**)&init); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| IPersistStreamInit_Release(init); |
| } |
| |
| static void test_olecontrol(void) |
| { |
| IOleControl *olecontrol; |
| CONTROLINFO info; |
| HRESULT hr; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IOleControl, (void**)&olecontrol); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| memset(&info, 0xab, sizeof(info)); |
| info.cb = sizeof(info); |
| hr = IOleControl_GetControlInfo(olecontrol, &info); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(info.hAccel == NULL, "got %p\n", info.hAccel); |
| ok(info.cAccel == 0, "got %d\n", info.cAccel); |
| ok(info.dwFlags == 0xabababab, "got %x\n", info.dwFlags); |
| |
| memset(&info, 0xab, sizeof(info)); |
| info.cb = sizeof(info) - 1; |
| hr = IOleControl_GetControlInfo(olecontrol, &info); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(info.hAccel == NULL, "got %p\n", info.hAccel); |
| ok(info.cAccel == 0, "got %d\n", info.cAccel); |
| ok(info.dwFlags == 0xabababab, "got %x\n", info.dwFlags); |
| |
| if (0) /* crashes on win2k3 */ |
| { |
| hr = IOleControl_GetControlInfo(olecontrol, NULL); |
| ok(hr == E_POINTER, "got 0x%08x\n", hr); |
| } |
| |
| IOleControl_Release(olecontrol); |
| } |
| |
| static void test_Language(void) |
| { |
| static const WCHAR jsW[] = {'J','S','c','r','i','p','t',0}; |
| static const WCHAR vb2W[] = {'v','B','s','c','r','i','p','t',0}; |
| static const WCHAR dummyW[] = {'d','u','m','m','y',0}; |
| IScriptControl *sc; |
| HRESULT hr; |
| BSTR str; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_get_Language(sc, NULL); |
| ok(hr == E_POINTER, "got 0x%08x\n", hr); |
| |
| str = (BSTR)0xdeadbeef; |
| hr = IScriptControl_get_Language(sc, &str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(str == NULL, "got %s\n", wine_dbgstr_w(str)); |
| |
| str = SysAllocString(vbW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| str = SysAllocString(vb2W); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| hr = IScriptControl_get_Language(sc, &str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str)); |
| SysFreeString(str); |
| |
| str = SysAllocString(dummyW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == CTL_E_INVALIDPROPERTYVALUE, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| hr = IScriptControl_get_Language(sc, &str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str)); |
| SysFreeString(str); |
| |
| str = SysAllocString(jsW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| hr = IScriptControl_get_Language(sc, &str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(!lstrcmpW(str, jsW), "got %s\n", wine_dbgstr_w(str)); |
| SysFreeString(str); |
| |
| hr = IScriptControl_put_Language(sc, NULL); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_get_Language(sc, &str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(str == NULL, "got %s\n", wine_dbgstr_w(str)); |
| |
| IScriptControl_Release(sc); |
| |
| /* custom script engine */ |
| if (register_script_engine()) { |
| static const WCHAR testscriptW[] = {'t','e','s','t','s','c','r','i','p','t',0}; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| SET_EXPECT(CreateInstance); |
| SET_EXPECT(SetInterfaceSafetyOptions); |
| SET_EXPECT(SetScriptSite); |
| SET_EXPECT(QI_IActiveScriptParse); |
| SET_EXPECT(InitNew); |
| |
| str = SysAllocString(testscriptW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| CHECK_CALLED(CreateInstance); |
| CHECK_CALLED(SetInterfaceSafetyOptions); |
| CHECK_CALLED(SetScriptSite); |
| CHECK_CALLED(QI_IActiveScriptParse); |
| CHECK_CALLED(InitNew); |
| hr = IScriptControl_get_Language(sc, &str); |
| todo_wine |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| if (hr == S_OK) |
| ok(!lstrcmpW(testscriptW, str), "%s\n", wine_dbgstr_w(str)); |
| SysFreeString(str); |
| |
| init_registry(FALSE); |
| |
| SET_EXPECT(Close); |
| |
| IScriptControl_Release(sc); |
| |
| CHECK_CALLED(Close); |
| } |
| else |
| skip("Could not register TestScript engine\n"); |
| } |
| |
| static void test_connectionpoints(void) |
| { |
| IConnectionPointContainer *container, *container2; |
| IConnectionPoint *cp; |
| IScriptControl *sc; |
| HRESULT hr; |
| IID iid; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| EXPECT_REF(sc, 1); |
| hr = IScriptControl_QueryInterface(sc, &IID_IConnectionPointContainer, (void**)&container); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| EXPECT_REF(sc, 2); |
| EXPECT_REF(container, 2); |
| |
| hr = IConnectionPointContainer_FindConnectionPoint(container, &IID_IPropertyNotifySink, &cp); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| if (0) /* crashes on win2k3 */ |
| { |
| hr = IConnectionPoint_GetConnectionPointContainer(cp, NULL); |
| ok(hr == E_POINTER, "got 0x%08x\n", hr); |
| } |
| |
| hr = IConnectionPoint_GetConnectionInterface(cp, &iid); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(IsEqualIID(&iid, &IID_IPropertyNotifySink), "got %s\n", wine_dbgstr_guid(&iid)); |
| |
| hr = IConnectionPoint_GetConnectionPointContainer(cp, &container2); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(container2 == container, "got %p, expected %p\n", container2, container); |
| IConnectionPointContainer_Release(container2); |
| |
| IConnectionPoint_Release(cp); |
| |
| hr = IConnectionPointContainer_FindConnectionPoint(container, &DIID_DScriptControlSource, &cp); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| if (0) /* crashes on win2k3 */ |
| { |
| hr = IConnectionPoint_GetConnectionPointContainer(cp, NULL); |
| ok(hr == E_POINTER, "got 0x%08x\n", hr); |
| } |
| |
| hr = IConnectionPoint_GetConnectionInterface(cp, &iid); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(IsEqualIID(&iid, &DIID_DScriptControlSource), "got %s\n", wine_dbgstr_guid(&iid)); |
| |
| hr = IConnectionPoint_GetConnectionPointContainer(cp, &container2); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(container2 == container, "got %p, expected %p\n", container2, container); |
| IConnectionPointContainer_Release(container2); |
| |
| IConnectionPoint_Release(cp); |
| |
| IConnectionPointContainer_Release(container); |
| IScriptControl_Release(sc); |
| } |
| |
| static void test_quickactivate(void) |
| { |
| IScriptControl *sc; |
| IQuickActivate *qa; |
| HRESULT hr; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_QueryInterface(sc, &IID_IQuickActivate, (void**)&qa); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| IQuickActivate_Release(qa); |
| IScriptControl_Release(sc); |
| } |
| |
| static void test_viewobject(void) |
| { |
| DWORD status, aspect, flags; |
| IViewObjectEx *viewex; |
| IScriptControl *sc; |
| IViewObject *view; |
| IAdviseSink *sink; |
| HRESULT hr; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_QueryInterface(sc, &IID_IViewObject, (void**)&view); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| IViewObject_Release(view); |
| |
| hr = IScriptControl_QueryInterface(sc, &IID_IViewObject2, (void**)&view); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| sink = (IAdviseSink*)0xdeadbeef; |
| hr = IViewObject_GetAdvise(view, &aspect, &flags, &sink); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(aspect == DVASPECT_CONTENT, "got %u\n", aspect); |
| ok(flags == 0, "got %#x\n", flags); |
| ok(sink == NULL, "got %p\n", sink); |
| |
| hr = IViewObject_SetAdvise(view, DVASPECT_CONTENT, 0, NULL); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IViewObject_SetAdvise(view, DVASPECT_THUMBNAIL, 0, NULL); |
| ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr); |
| |
| hr = IViewObject_SetAdvise(view, DVASPECT_ICON, 0, NULL); |
| ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr); |
| |
| hr = IViewObject_SetAdvise(view, DVASPECT_DOCPRINT, 0, NULL); |
| ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr); |
| |
| sink = (IAdviseSink*)0xdeadbeef; |
| hr = IViewObject_GetAdvise(view, &aspect, &flags, &sink); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(aspect == DVASPECT_CONTENT, "got %u\n", aspect); |
| ok(flags == 0, "got %#x\n", flags); |
| ok(sink == NULL, "got %p\n", sink); |
| |
| IViewObject_Release(view); |
| |
| hr = IScriptControl_QueryInterface(sc, &IID_IViewObjectEx, (void**)&viewex); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| if (0) /* crashes */ |
| hr = IViewObjectEx_GetViewStatus(viewex, NULL); |
| |
| status = 0; |
| hr = IViewObjectEx_GetViewStatus(viewex, &status); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(status == VIEWSTATUS_OPAQUE, "got %#x\n", status); |
| |
| IViewObjectEx_Release(viewex); |
| |
| IScriptControl_Release(sc); |
| } |
| |
| static void test_pointerinactive(void) |
| { |
| IPointerInactive *pi; |
| IScriptControl *sc; |
| DWORD policy; |
| HRESULT hr; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_QueryInterface(sc, &IID_IPointerInactive, (void**)&pi); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| if (0) /* crashes w2k3 */ |
| hr = IPointerInactive_GetActivationPolicy(pi, NULL); |
| |
| policy = 123; |
| hr = IPointerInactive_GetActivationPolicy(pi, &policy); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(policy == 0, "got %#x\n", policy); |
| |
| IPointerInactive_Release(pi); |
| IScriptControl_Release(sc); |
| } |
| |
| static void test_timeout(void) |
| { |
| IScriptControl *sc; |
| HRESULT hr; |
| LONG val; |
| BSTR str; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_get_Timeout(sc, NULL); |
| ok(hr == E_POINTER, "got 0x%08x\n", hr); |
| |
| val = 0; |
| hr = IScriptControl_get_Timeout(sc, &val); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(val == 10000, "got %d\n", val); |
| |
| hr = IScriptControl_put_Timeout(sc, -1); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| val = 0; |
| hr = IScriptControl_get_Timeout(sc, &val); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(val == -1, "got %d\n", val); |
| |
| hr = IScriptControl_put_Timeout(sc, -2); |
| ok(hr == CTL_E_INVALIDPROPERTYVALUE, "got 0x%08x\n", hr); |
| |
| val = 0; |
| hr = IScriptControl_get_Timeout(sc, &val); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(val == -1, "got %d\n", val); |
| |
| hr = IScriptControl_put_Timeout(sc, 0); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| val = 1; |
| hr = IScriptControl_get_Timeout(sc, &val); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(val == 0, "got %d\n", val); |
| |
| str = SysAllocString(vbW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| val = 1; |
| hr = IScriptControl_get_Timeout(sc, &val); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(val == 0, "got %d\n", val); |
| |
| hr = IScriptControl_put_Timeout(sc, 10000); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| IScriptControl_Release(sc); |
| } |
| |
| static void test_Reset(void) |
| { |
| IScriptControl *sc; |
| HRESULT hr; |
| BSTR str; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_Reset(sc); |
| ok(hr == E_FAIL, "got 0x%08x\n", hr); |
| |
| str = SysAllocString(vbW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| hr = IScriptControl_Reset(sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_get_Language(sc, &str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str)); |
| SysFreeString(str); |
| |
| IScriptControl_Release(sc); |
| |
| /* custom script engine */ |
| if (register_script_engine()) { |
| static const WCHAR testscriptW[] = {'t','e','s','t','s','c','r','i','p','t',0}; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| SET_EXPECT(CreateInstance); |
| SET_EXPECT(SetInterfaceSafetyOptions); |
| SET_EXPECT(SetScriptSite); |
| SET_EXPECT(QI_IActiveScriptParse); |
| SET_EXPECT(InitNew); |
| |
| str = SysAllocString(testscriptW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| SET_EXPECT(SetScriptState_INITIALIZED); |
| hr = IScriptControl_Reset(sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| CHECK_CALLED(SetScriptState_INITIALIZED); |
| |
| SET_EXPECT(SetScriptState_INITIALIZED); |
| hr = IScriptControl_Reset(sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| CHECK_CALLED(SetScriptState_INITIALIZED); |
| |
| init_registry(FALSE); |
| |
| SET_EXPECT(Close); |
| |
| IScriptControl_Release(sc); |
| |
| CHECK_CALLED(Close); |
| } |
| else |
| skip("Could not register TestScript engine\n"); |
| } |
| |
| static HRESULT WINAPI disp_QI(IDispatch *iface, REFIID riid, void **obj) |
| { |
| if (IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown)) { |
| *obj = iface; |
| IDispatch_AddRef(iface); |
| return S_OK; |
| } |
| |
| *obj = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| static ULONG WINAPI disp_AddRef(IDispatch *iface) |
| { |
| return 2; |
| } |
| |
| static ULONG WINAPI disp_Release(IDispatch *iface) |
| { |
| return 1; |
| } |
| |
| static HRESULT WINAPI disp_GetTypeInfoCount(IDispatch *iface, UINT *count) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI disp_GetTypeInfo(IDispatch *iface, UINT index, LCID lcid, ITypeInfo **ti) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI disp_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *names, |
| UINT cnames, LCID lcid, DISPID *dispid) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI disp_Invoke(IDispatch *iface, DISPID dispid, REFIID riid, LCID lcid, |
| WORD flags, DISPPARAMS *dispparams, VARIANT *result, EXCEPINFO *ei, UINT *arg_err) |
| { |
| ok(0, "unexpected call\n"); |
| return E_NOTIMPL; |
| } |
| |
| static const IDispatchVtbl dispvtbl = { |
| disp_QI, |
| disp_AddRef, |
| disp_Release, |
| disp_GetTypeInfoCount, |
| disp_GetTypeInfo, |
| disp_GetIDsOfNames, |
| disp_Invoke |
| }; |
| |
| static IDispatch testdisp = { &dispvtbl }; |
| |
| static void test_AddObject(void) |
| { |
| static const WCHAR oW[] = {'o',0}; |
| IScriptControl *sc; |
| BSTR str, objname; |
| HRESULT hr; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| objname = SysAllocString(oW); |
| hr = IScriptControl_AddObject(sc, objname, NULL, VARIANT_FALSE); |
| ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_FALSE); |
| ok(hr == E_FAIL, "got 0x%08x\n", hr); |
| |
| str = SysAllocString(vbW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_TRUE); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_Reset(sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_TRUE); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| IScriptControl_Release(sc); |
| |
| /* custom script engine */ |
| if (register_script_engine()) { |
| static const WCHAR testscriptW[] = {'t','e','s','t','s','c','r','i','p','t',0}; |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IScriptControl, (void**)&sc); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| |
| SET_EXPECT(CreateInstance); |
| SET_EXPECT(SetInterfaceSafetyOptions); |
| SET_EXPECT(SetScriptSite); |
| SET_EXPECT(QI_IActiveScriptParse); |
| SET_EXPECT(InitNew); |
| |
| str = SysAllocString(testscriptW); |
| hr = IScriptControl_put_Language(sc, str); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| SysFreeString(str); |
| |
| hr = IScriptControl_AddObject(sc, objname, NULL, VARIANT_FALSE); |
| ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); |
| |
| SET_EXPECT(AddNamedItem); |
| hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_TRUE); |
| ok(hr == S_OK, "got 0x%08x\n", hr); |
| CHECK_CALLED(AddNamedItem); |
| |
| hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_TRUE); |
| ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); |
| |
| init_registry(FALSE); |
| |
| SET_EXPECT(Close); |
| |
| IScriptControl_Release(sc); |
| |
| CHECK_CALLED(Close); |
| } |
| else |
| skip("Could not register TestScript engine\n"); |
| |
| SysFreeString(objname); |
| } |
| |
| START_TEST(msscript) |
| { |
| IUnknown *unk; |
| HRESULT hr; |
| |
| CoInitialize(NULL); |
| |
| hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, |
| &IID_IUnknown, (void**)&unk); |
| if (FAILED(hr)) { |
| win_skip("Could not create ScriptControl object: %08x\n", hr); |
| return; |
| } |
| IUnknown_Release(unk); |
| |
| test_oleobject(); |
| test_persiststreaminit(); |
| test_olecontrol(); |
| test_Language(); |
| test_connectionpoints(); |
| test_quickactivate(); |
| test_viewobject(); |
| test_pointerinactive(); |
| test_timeout(); |
| test_Reset(); |
| test_AddObject(); |
| |
| CoUninitialize(); |
| } |