static void test_persiststreaminit(void) { IXMLDocument *doc = NULL; IXMLElement *element = NULL; IPersistStreamInit *psi = NULL; IStream *stream = NULL; STATSTG stat; HRESULT hr; ULARGE_INTEGER size; CHAR path[MAX_PATH]; CLSID id; BSTR str; static const WCHAR testW[] = {'t','e','s','t',0}; hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); hr = IXMLDocument_QueryInterface(doc, &IID_IPersistStreamInit, (LPVOID *)&psi); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(psi != NULL, "Expected non-NULL psi\n"); /* null arguments */ hr = IPersistStreamInit_GetSizeMax(psi, NULL); ok(hr == E_NOTIMPL, "Expected E_NOTIMPL, got %08x\n", hr); hr = IPersistStreamInit_Load(psi, NULL); ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); hr = IPersistStreamInit_Save(psi, NULL, FALSE); todo_wine ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); hr = IPersistStreamInit_GetClassID(psi, NULL); ok(hr == E_POINTER, "Expected E_POINTER, got %08x\n", hr); hr = IPersistStreamInit_IsDirty(psi); todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); create_xml_file("bank.xml"); GetFullPathNameA("bank.xml", MAX_PATH, path, NULL); create_stream_on_file(&stream, path); /* GetSizeMax not implemented */ size.QuadPart = 0; hr = IPersistStreamInit_GetSizeMax(psi, &size); ok(hr == E_NOTIMPL, "Expected E_NOTIMPL, got %08x\n", hr); ok(size.QuadPart == 0, "Expected 0\n"); hr = IPersistStreamInit_Load(psi, stream); IStream_Release(stream); ok(hr == S_OK || hr == XML_E_INVALIDATROOTLEVEL, "Expected S_OK, got %08x\n", hr); if(hr == XML_E_INVALIDATROOTLEVEL) goto cleanup; hr = IPersistStreamInit_IsDirty(psi); todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); /* try to save document */ stream = NULL; hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); hr = IPersistStreamInit_Save(psi, stream, FALSE); todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); stat.cbSize.QuadPart = 0; hr = IStream_Stat(stream, &stat, 0); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); todo_wine ok(stat.cbSize.QuadPart > 0, "Expected >0\n"); IStream_Release(stream); str = SysAllocString(testW); hr = IXMLDocument_get_root(doc, &element); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); hr = IXMLElement_put_text(element, str); ok(hr == E_NOTIMPL, "Expected E_NOTIMPL, got %08x\n", hr); IXMLElement_Release(element); SysFreeString(str); hr = IPersistStreamInit_IsDirty(psi); todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); create_stream_on_file(&stream, path); hr = IPersistStreamInit_Load(psi, stream); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); IStream_Release(stream); hr = IPersistStreamInit_IsDirty(psi); todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); /* reset internal stream */ hr = IPersistStreamInit_InitNew(psi); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); hr = IPersistStreamInit_IsDirty(psi); todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); stream = NULL; hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); hr = IPersistStreamInit_Save(psi, stream, FALSE); todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); stat.cbSize.QuadPart = 0; hr = IStream_Stat(stream, &stat, 0); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); todo_wine ok(stat.cbSize.QuadPart > 0, "Expected >0\n"); IStream_Release(stream); memset(&id, 0, sizeof(id)); hr = IPersistStreamInit_GetClassID(psi, &id); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(IsEqualCLSID(&id, &CLSID_XMLDocument), "Expected CLSID_XMLDocument\n"); cleanup: IPersistStreamInit_Release(psi); IXMLDocument_Release(doc); DeleteFileA("bank.xml"); }
/*********************************************************************** * AtlAxCreateControlEx [atl100.@] * * REMARKS * See http://www.codeproject.com/com/cwebpage.asp for some background * */ HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, IStream *pStream, IUnknown **ppUnkContainer, IUnknown **ppUnkControl, REFIID iidSink, IUnknown *punkSink) { CLSID controlId; HRESULT hRes; IOleObject *pControl; IUnknown *pUnkControl; IPersistStreamInit *pPSInit; IUnknown *pContainer; enum {IsGUID=0,IsHTML=1,IsURL=2} content; TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, ppUnkContainer, ppUnkControl, iidSink, punkSink); hRes = CLSIDFromString( lpszName, &controlId ); if ( FAILED(hRes) ) hRes = CLSIDFromProgID( lpszName, &controlId ); if ( SUCCEEDED( hRes ) ) content = IsGUID; else { /* FIXME - check for MSHTML: prefix! */ content = IsURL; controlId = CLSID_WebBrowser; } hRes = CoCreateInstance( &controlId, 0, CLSCTX_ALL, &IID_IOleObject, (void**) &pControl ); if ( FAILED( hRes ) ) { WARN( "cannot create ActiveX control %s instance - error 0x%08x\n", debugstr_guid( &controlId ), hRes ); return hRes; } hRes = IOleObject_QueryInterface( pControl, &IID_IPersistStreamInit, (void**) &pPSInit ); if ( SUCCEEDED( hRes ) ) { if (!pStream) IPersistStreamInit_InitNew( pPSInit ); else IPersistStreamInit_Load( pPSInit, pStream ); IPersistStreamInit_Release( pPSInit ); } else WARN("cannot get IID_IPersistStreamInit out of control\n"); IOleObject_QueryInterface( pControl, &IID_IUnknown, (void**) &pUnkControl ); IOleObject_Release( pControl ); hRes = AtlAxAttachControl( pUnkControl, hWnd, &pContainer ); if ( FAILED( hRes ) ) WARN("cannot attach control to window\n"); if ( content == IsURL ) { IWebBrowser2 *browser; hRes = IOleObject_QueryInterface( pControl, &IID_IWebBrowser2, (void**) &browser ); if ( !browser ) WARN( "Cannot query IWebBrowser2 interface: %08x\n", hRes ); else { VARIANT url; IWebBrowser2_put_Visible( browser, VARIANT_TRUE ); /* it seems that native does this on URL (but do not on MSHTML:! why? */ V_VT(&url) = VT_BSTR; V_BSTR(&url) = SysAllocString( lpszName ); hRes = IWebBrowser2_Navigate2( browser, &url, NULL, NULL, NULL, NULL ); if ( FAILED( hRes ) ) WARN( "IWebBrowser2::Navigate2 failed: %08x\n", hRes ); SysFreeString( V_BSTR(&url) ); IWebBrowser2_Release( browser ); } } if (ppUnkContainer) { *ppUnkContainer = pContainer; if ( pContainer ) IUnknown_AddRef( pContainer ); } if (ppUnkControl) { *ppUnkControl = pUnkControl; if ( pUnkControl ) IUnknown_AddRef( pUnkControl ); } if ( pUnkControl ) IUnknown_Release( pUnkControl ); if ( pContainer ) IUnknown_Release( pContainer ); return S_OK; }
static void test_wmp(void) { IProvideClassInfo2 *class_info; IOleClientSite *client_site; IOleInPlaceObject *ipobj; IPersistStreamInit *psi; IOleObject *oleobj; IWMPCore *wmpcore; DWORD misc_status; RECT pos = {0,0,100,100}; HWND hwnd; GUID guid; LONG ref; HRESULT hres; BSTR str; hres = CoCreateInstance(&CLSID_WindowsMediaPlayer, NULL, CLSCTX_INPROC_SERVER, &IID_IOleObject, (void**)&oleobj); if(hres == REGDB_E_CLASSNOTREG) { win_skip("CLSID_WindowsMediaPlayer not registered\n"); return; } ok(hres == S_OK, "Could not create CLSID_WindowsMediaPlayer instance: %08x\n", hres); hres = IOleObject_QueryInterface(oleobj, &IID_IWMPCore, (void**)&wmpcore); ok(hres == S_OK, "got 0x%08x\n", hres); hres = IWMPCore_get_versionInfo(wmpcore, NULL); ok(hres == E_POINTER, "got 0x%08x\n", hres); hres = IWMPCore_get_versionInfo(wmpcore, &str); ok(hres == S_OK, "got 0x%08x\n", hres); SysFreeString(str); IWMPCore_Release(wmpcore); hres = IOleObject_QueryInterface(oleobj, &IID_IProvideClassInfo2, (void**)&class_info); ok(hres == S_OK, "Could not get IProvideClassInfo2 iface: %08x\n", hres); hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid); ok(hres == S_OK, "GetGUID failed: %08x\n", hres); ok(IsEqualGUID(&guid, &IID__WMPOCXEvents), "guid = %s\n", wine_dbgstr_guid(&guid)); IProvideClassInfo2_Release(class_info); test_QI((IUnknown*)oleobj); hres = IOleObject_GetMiscStatus(oleobj, DVASPECT_CONTENT, &misc_status); ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres); ok(misc_status == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE), "misc_status = %x\n", misc_status); hres = IOleObject_QueryInterface(oleobj, &IID_IPersistStreamInit, (void**)&psi); ok(hres == S_OK, "Could not get IPersistStreamInit iface: %08x\n", hres); hres = IOleObject_QueryInterface(oleobj, &IID_IOleInPlaceObject, (void**)&ipobj); ok(hres == S_OK, "Could not get IOleInPlaceObject iface: %08x\n", hres); hres = IPersistStreamInit_InitNew(psi); ok(hres == E_FAIL || broken(hres == S_OK /* Old WMP */), "InitNew failed: %08x\n", hres); SET_EXPECT(GetContainer); SET_EXPECT(GetExtendedControl); SET_EXPECT(GetWindow); SET_EXPECT(Invoke_USERMODE); hres = IOleObject_SetClientSite(oleobj, &ClientSite); ok(hres == S_OK, "SetClientSite failed: %08x\n", hres); todo_wine CHECK_CALLED(GetContainer); CHECK_CALLED(GetExtendedControl); todo_wine CHECK_CALLED(GetWindow); todo_wine CHECK_CALLED(Invoke_USERMODE); client_site = NULL; hres = IOleObject_GetClientSite(oleobj, &client_site); ok(hres == S_OK, "GetClientSite failed: %08x\n", hres); ok(client_site == &ClientSite, "client_site != ClientSite\n"); SET_EXPECT(GetWindow); hres = IPersistStreamInit_InitNew(psi); ok(hres == S_OK, "InitNew failed: %08x\n", hres); CHECK_CALLED(GetWindow); hwnd = (HWND)0xdeadbeef; hres = IOleInPlaceObject_GetWindow(ipobj, &hwnd); ok(hres == E_UNEXPECTED, "GetWindow failed: %08x\n", hres); ok(!hwnd, "hwnd = %p\n", hwnd); SET_EXPECT(GetWindow); SET_EXPECT(CanWindowlessActivate); SET_EXPECT(OnInPlaceActivateEx); SET_EXPECT(GetWindowContext); SET_EXPECT(ShowObject); hres = IOleObject_DoVerb(oleobj, OLEIVERB_INPLACEACTIVATE, NULL, &ClientSite, 0, container_hwnd, &pos); ok(hres == S_OK, "DoVerb failed: %08x\n", hres); CHECK_CALLED(GetWindow); CHECK_CALLED(CanWindowlessActivate); CHECK_CALLED(OnInPlaceActivateEx); CHECK_CALLED(GetWindowContext); CHECK_CALLED(ShowObject); hwnd = NULL; hres = IOleInPlaceObject_GetWindow(ipobj, &hwnd); ok(hres == S_OK, "GetWindow failed: %08x\n", hres); ok(hwnd != NULL, "hwnd = NULL\n"); test_window(hwnd); SetRect(&pos, 1, 2, 301, 312); hres = IOleInPlaceObject_SetObjectRects(ipobj, &pos, &pos); ok(hres == S_OK, "SetObjectRects failed: %08x\n", hres); GetClientRect(hwnd, &pos); test_rect_size(&pos, 300, 310); test_wmp_ifaces(oleobj); hres = IOleObject_DoVerb(oleobj, OLEIVERB_HIDE, NULL, &ClientSite, 0, container_hwnd, &pos); ok(hres == S_OK, "DoVerb failed: %08x\n", hres); ok(!IsWindowVisible(hwnd), "Window is visible\n"); SET_EXPECT(OnShowWindow_FALSE); SET_EXPECT(OnInPlaceDeactivate); hres = IOleObject_Close(oleobj, 0); ok(hres == S_OK, "Close failed: %08x\n", hres); todo_wine CHECK_CALLED(OnShowWindow_FALSE); CHECK_CALLED(OnInPlaceDeactivate); hwnd = (HWND)0xdeadbeef; hres = IOleInPlaceObject_GetWindow(ipobj, &hwnd); ok(hres == E_UNEXPECTED, "GetWindow failed: %08x\n", hres); ok(!hwnd, "hwnd = %p\n", hwnd); hres = IOleObject_Close(oleobj, 0); ok(hres == S_OK, "Close failed: %08x\n", hres); hres = IOleObject_SetClientSite(oleobj, NULL); ok(hres == S_OK, "SetClientSite failed: %08x\n", hres); client_site = (void*)0xdeadbeef; hres = IOleObject_GetClientSite(oleobj, &client_site); ok(hres == E_FAIL || broken(hres == S_OK), "GetClientSite failed: %08x\n", hres); ok(!client_site, "client_site = %p\n", client_site); IPersistStreamInit_Release(psi); IOleInPlaceObject_Release(ipobj); ref = IOleObject_Release(oleobj); ok(!ref, "ref = %d\n", ref); }