static void test_InternetExplorer(void) { IWebBrowser2 *wb; IUnknown *unk; ULONG ref; HRESULT hres; hres = CoCreateInstance(&CLSID_InternetExplorer, NULL, CLSCTX_SERVER, &IID_IUnknown, (void**)&unk); ok(hres == S_OK, "Could not create InternetExplorer instance: %08x\n", hres); if(hres != S_OK) return; advise_cp(unk, TRUE); hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb); ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres); test_visible(wb); test_html_window(wb); test_navigate(wb, "http://test.winehq.org/tests/hello.html"); advise_cp(unk, FALSE); IWebBrowser2_Release(wb); ref = IUnknown_Release(unk); ok(!ref, "object not destroyed, ref=%u\n", ref); }
static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, void **ppv) { WebBrowser *ret; HRESULT hres; TRACE("(%p %s %p) version=%d\n", pOuter, debugstr_guid(riid), ppv, version); ret = heap_alloc_zero(sizeof(WebBrowser)); ret->lpWebBrowser2Vtbl = &WebBrowser2Vtbl; ret->lpServiceProviderVtbl = &ServiceProviderVtbl; ret->ref = 1; ret->version = version; DocHost_Init(&ret->doc_host, (IDispatch*)WEBBROWSER2(ret)); ret->visible = VARIANT_TRUE; ret->menu_bar = VARIANT_TRUE; ret->address_bar = VARIANT_TRUE; ret->status_bar = VARIANT_TRUE; ret->tool_bar = VARIANT_TRUE; WebBrowser_OleObject_Init(ret); WebBrowser_ViewObject_Init(ret); WebBrowser_Persist_Init(ret); WebBrowser_ClassInfo_Init(ret); WebBrowser_HlinkFrame_Init(ret); SHDOCVW_LockModule(); hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv); IWebBrowser2_Release(WEBBROWSER(ret)); return hres; }
static ULONG STDMETHODCALLTYPE Site_Release(IOleClientSite *iface) { WebBrowserContainer *This = impl_from_IOleClientSite(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { if(This->ole_obj) IOleObject_Release(This->ole_obj); if(This->web_browser) IWebBrowser2_Release(This->web_browser); heap_free(This); } return ref; }
/****************************************************************** * IEWinMain (SHDOCVW.101) * * Only returns on error. */ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow) { IWebBrowser2 *wb = NULL; MSG msg; HRESULT hres; TRACE("%s %d\n", debugstr_a(szCommandLine), nShowWindow); if(*szCommandLine == '-' || *szCommandLine == '/') { if(!strcasecmp(szCommandLine+1, "regserver")) return register_iexplore(TRUE); if(!strcasecmp(szCommandLine+1, "unregserver")) return register_iexplore(FALSE); } CoInitialize(NULL); hres = register_class_object(TRUE); if(FAILED(hres)) { CoUninitialize(); ExitProcess(1); } if(strcasecmp(szCommandLine, "-embedding")) wb = create_ie_window(szCommandLine); /* run the message loop for this thread */ while (GetMessageW(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg); } if(wb) IWebBrowser2_Release(wb); register_class_object(FALSE); CoUninitialize(); ExitProcess(0); return 0; }
static void test_InternetExplorer(void) { IWebBrowser2 *wb; IUnknown *unk; ULONG ref; HRESULT hres; hres = CoCreateInstance(&CLSID_InternetExplorer, NULL, CLSCTX_SERVER, &IID_IUnknown, (void**)&unk); ok(hres == S_OK, "Could not create InternetExplorer instance: %08x\n", hres); if(hres != S_OK) return; hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb); ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres); test_visible(wb); IWebBrowser2_Release(wb); ref = IUnknown_Release(unk); ok(!ref, "object not destroyed, ref=%u\n", ref); }
static HRESULT create_webbrowser(int version, IUnknown *outer, REFIID riid, void **ppv) { WebBrowser *ret; HRESULT hres; TRACE("(%p %s %p) version=%d\n", outer, debugstr_guid(riid), ppv, version); ret = heap_alloc_zero(sizeof(WebBrowser)); ret->IWebBrowser2_iface.lpVtbl = &WebBrowser2Vtbl; ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl; ret->ref = 1; ret->version = version; DocHost_Init(&ret->doc_host, &ret->IWebBrowser2_iface, &DocHostContainerVtbl); ret->visible = VARIANT_TRUE; ret->menu_bar = VARIANT_TRUE; ret->address_bar = VARIANT_TRUE; ret->status_bar = VARIANT_TRUE; ret->tool_bar = VARIANT_TRUE; WebBrowser_OleObject_Init(ret); WebBrowser_ViewObject_Init(ret); WebBrowser_Persist_Init(ret); WebBrowser_ClassInfo_Init(ret); HlinkFrame_Init(&ret->hlink_frame, (IUnknown*)&ret->IWebBrowser2_iface, &ret->doc_host); lock_module(); hres = IWebBrowser2_QueryInterface(&ret->IWebBrowser2_iface, riid, ppv); IWebBrowser2_Release(&ret->IWebBrowser2_iface); return hres; }
static ULONG WINAPI WBOleCommandTarget_Release(IOleCommandTarget *iface) { WebBrowser *This = impl_from_IOleCommandTarget(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static ULONG WINAPI InPlaceActiveObject_Release(IOleInPlaceActiveObject *iface) { WebBrowser *This = impl_from_IOleInPlaceActiveObject(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static ULONG WINAPI HlinkFrame_Release(IHlinkFrame *iface) { WebBrowser *This = HLINKFRAME_THIS(iface); return IWebBrowser2_Release(WEBBROWSER2(This)); }
static ULONG WINAPI ExternalConnection_Release(IExternalConnection *iface) { InternetExplorer *This = impl_from_IExternalConnection(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static ULONG WINAPI OleControl_Release(IOleControl *iface) { WebBrowser *This = impl_from_IOleControl(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static ULONG WINAPI ProvideClassInfo_Release(IProvideClassInfo2 *iface) { WebBrowser *This = impl_from_IProvideClassInfo2(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static ULONG WINAPI WBServiceProvider_Release(IServiceProvider *iface) { WebBrowser *This = impl_from_IServiceProvider(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static ULONG WINAPI InPlaceActiveObject_Release(IOleInPlaceActiveObject *iface) { WebBrowser *This = ACTIVEOBJ_THIS(iface); return IWebBrowser2_Release(WEBBROWSER2(This)); }
static ULONG WINAPI WBOleCommandTarget_Release(IOleCommandTarget *iface) { WebBrowser *This = OLECMD_THIS(iface); return IWebBrowser2_Release(WEBBROWSER(This)); }
static ULONG WINAPI ViewObject_Release(IViewObject2 *iface) { WebBrowser *This = impl_from_IViewObject2(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static ULONG WINAPI DataObject_Release(LPDATAOBJECT iface) { WebBrowser *This = impl_from_IDataObject(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite) { HTMLDocument *This = impl_from_IOleObject(iface); IOleCommandTarget *cmdtrg = NULL; IOleWindow *ole_window; BOOL hostui_setup; VARIANT silent; HWND hwnd; HRESULT hres; TRACE("(%p)->(%p)\n", This, pClientSite); if(pClientSite == This->doc_obj->client) return S_OK; if(This->doc_obj->client) { IOleClientSite_Release(This->doc_obj->client); This->doc_obj->client = NULL; This->doc_obj->usermode = UNKNOWN_USERMODE; } if(This->doc_obj->hostui && !This->doc_obj->custom_hostui) { IDocHostUIHandler_Release(This->doc_obj->hostui); This->doc_obj->hostui = NULL; } if(This->doc_obj->doc_object_service) { IDocObjectService_Release(This->doc_obj->doc_object_service); This->doc_obj->doc_object_service = NULL; } memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO)); This->doc_obj->is_webbrowser = FALSE; if(!pClientSite) return S_OK; IOleClientSite_AddRef(pClientSite); This->doc_obj->client = pClientSite; hostui_setup = This->doc_obj->hostui_setup; if(!This->doc_obj->hostui) { IDocHostUIHandler *uihandler; This->doc_obj->custom_hostui = FALSE; hres = IOleObject_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&uihandler); if(SUCCEEDED(hres)) This->doc_obj->hostui = uihandler; } if(This->doc_obj->hostui) { DOCHOSTUIINFO hostinfo; LPOLESTR key_path = NULL, override_key_path = NULL; IDocHostUIHandler2 *uihandler2; memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO)); hostinfo.cbSize = sizeof(DOCHOSTUIINFO); hres = IDocHostUIHandler_GetHostInfo(This->doc_obj->hostui, &hostinfo); if(SUCCEEDED(hres)) { TRACE("hostinfo = {%u %08x %08x %s %s}\n", hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick, debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS)); update_hostinfo(This->doc_obj, &hostinfo); This->doc_obj->hostinfo = hostinfo; } if(!hostui_setup) { hres = IDocHostUIHandler_GetOptionKeyPath(This->doc_obj->hostui, &key_path, 0); if(hres == S_OK && key_path) { if(key_path[0]) { /* FIXME: use key_path */ TRACE("key_path = %s\n", debugstr_w(key_path)); } CoTaskMemFree(key_path); } hres = IDocHostUIHandler_QueryInterface(This->doc_obj->hostui, &IID_IDocHostUIHandler2, (void**)&uihandler2); if(SUCCEEDED(hres)) { hres = IDocHostUIHandler2_GetOverrideKeyPath(uihandler2, &override_key_path, 0); if(hres == S_OK && override_key_path && override_key_path[0]) { if(override_key_path[0]) { /*FIXME: use override_key_path */ TRACE("override_key_path = %s\n", debugstr_w(override_key_path)); } CoTaskMemFree(override_key_path); } IDocHostUIHandler2_Release(uihandler2); } This->doc_obj->hostui_setup = TRUE; } } /* Native calls here GetWindow. What is it for? * We don't have anything to do with it here (yet). */ hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&ole_window); if(SUCCEEDED(hres)) { IOleWindow_GetWindow(ole_window, &hwnd); IOleWindow_Release(ole_window); } hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT var; OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0}; if(!hostui_setup) { IDocObjectService *doc_object_service; IBrowserService *browser_service; IWebBrowser2 *wb; V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)&This->window->IHTMLWindow2_iface; IOleCommandTarget_Exec(cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0, &var, NULL); hres = do_query_service((IUnknown*)pClientSite, &IID_IShellBrowser, &IID_IBrowserService, (void**)&browser_service); if(SUCCEEDED(hres)) { hres = IBrowserService_QueryInterface(browser_service, &IID_IDocObjectService, (void**)&doc_object_service); if(SUCCEEDED(hres)) { This->doc_obj->doc_object_service = doc_object_service; /* * Some embedding routines, esp. in regards to use of IDocObjectService, differ if * embedder supports IWebBrowserApp. */ hres = do_query_service((IUnknown*)pClientSite, &IID_IWebBrowserApp, &IID_IWebBrowser2, (void**)&wb); if(SUCCEEDED(hres)) { This->doc_obj->is_webbrowser = TRUE; IWebBrowser2_Release(wb); } IBrowserService_Release(browser_service); } } } IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL); V_VT(&var) = VT_I4; V_I4(&var) = 0; IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Release(cmdtrg); } if(This->doc_obj->usermode == UNKNOWN_USERMODE) IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERMODE); IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED); hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent); if(SUCCEEDED(hres)) { if(V_VT(&silent) != VT_BOOL) WARN("V_VT(silent) = %d\n", V_VT(&silent)); else if(V_BOOL(&silent)) FIXME("silent == true\n"); } IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERAGENT); IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_PALETTE); return S_OK; }
/*********************************************************************** * 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 ULONG WebBrowser_release(DocHost *iface) { WebBrowser *This = impl_from_DocHost(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static ULONG WINAPI IEServiceProvider_Release(IServiceProvider *iface) { InternetExplorer *This = impl_from_IServiceProvider(iface); return IWebBrowser2_Release(&This->IWebBrowser2_iface); }
static void test_ShellWindows(void) { IShellWindows *shellwindows; LONG cookie, cookie2, ret; IDispatch *disp; VARIANT v, v2; HRESULT hr; HWND hwnd; hr = CoCreateInstance(&CLSID_ShellWindows, NULL, CLSCTX_LOCAL_SERVER, &IID_IShellWindows, (void**)&shellwindows); ok(hr == S_OK, "got 0x%08x\n", hr); /* TODO: remove when explorer startup with clean prefix is fixed */ if (hr != S_OK) return; if (0) { /* NULL out argument - currently crashes on Wine */ hr = IShellWindows_Register(shellwindows, NULL, 0, SWC_EXPLORER, NULL); ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "got 0x%08x\n", hr); } hr = IShellWindows_Register(shellwindows, NULL, 0, SWC_EXPLORER, &cookie); todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr); hr = IShellWindows_Register(shellwindows, (IDispatch*)shellwindows, 0, SWC_EXPLORER, &cookie); todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr); hr = IShellWindows_Register(shellwindows, (IDispatch*)shellwindows, 0, SWC_EXPLORER, &cookie); todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr); hwnd = CreateWindowExA(0, "button", "test", BS_CHECKBOX | WS_VISIBLE | WS_POPUP, 0, 0, 50, 14, 0, 0, 0, NULL); ok(hwnd != NULL, "got %p, error %d\n", hwnd, GetLastError()); cookie = 0; hr = IShellWindows_Register(shellwindows, NULL, HandleToLong(hwnd), SWC_EXPLORER, &cookie); todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(cookie != 0, "got %d\n", cookie); } cookie2 = 0; hr = IShellWindows_Register(shellwindows, NULL, HandleToLong(hwnd), SWC_EXPLORER, &cookie2); todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(cookie2 != 0 && cookie2 != cookie, "got %d\n", cookie2); } hr = IShellWindows_Revoke(shellwindows, cookie); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellWindows_Revoke(shellwindows, cookie2); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellWindows_Revoke(shellwindows, 0); todo_wine ok(hr == S_FALSE, "got 0x%08x\n", hr); /* we can register ourselves as desktop, but FindWindowSW still returns real desktop window */ cookie = 0; hr = IShellWindows_Register(shellwindows, NULL, HandleToLong(hwnd), SWC_DESKTOP, &cookie); todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(cookie != 0, "got %d\n", cookie); } disp = (void*)0xdeadbeef; ret = 0xdead; VariantInit(&v); hr = IShellWindows_FindWindowSW(shellwindows, &v, &v, SWC_DESKTOP, &ret, SWFO_NEEDDISPATCH, &disp); ok(hr == S_OK || broken(hr == S_FALSE), "got 0x%08x\n", hr); if (hr == S_FALSE) { /* winxp and earlier */ win_skip("SWC_DESKTOP is not supported, some tests will be skipped.\n"); /* older versions allowed to regiser SWC_DESKTOP and access it with FindWindowSW */ ok(disp == NULL, "got %p\n", disp); ok(ret == 0, "got %d\n", ret); } else { static const IID *browser_riids[] = { &IID_IWebBrowser2, &IID_NULL }; static const IID *viewdual_riids[] = { &IID_IShellFolderViewDual3, &IID_NULL }; IShellFolderViewDual *view; IShellBrowser *sb, *sb2; IServiceProvider *sp; IDispatch *doc, *app; IWebBrowser2 *wb; IShellView *sv; IUnknown *unk; ok(disp != NULL, "got %p\n", disp); ok(ret != HandleToUlong(hwnd), "got %d\n", ret); /* IDispatch-related tests */ test_dispatch_typeinfo(disp, browser_riids); /* IWebBrowser2 */ hr = IDispatch_QueryInterface(disp, &IID_IWebBrowser2, (void**)&wb); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IWebBrowser2_Refresh(wb); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); hr = IWebBrowser2_get_Application(wb, &app); ok(hr == S_OK, "got 0x%08x\n", hr); ok(disp == app, "got %p, %p\n", app, disp); IDispatch_Release(app); hr = IWebBrowser2_get_Document(wb, &doc); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); if (hr == S_OK) test_dispatch_typeinfo(doc, viewdual_riids); IWebBrowser2_Release(wb); /* IServiceProvider */ hr = IDispatch_QueryInterface(disp, &IID_IShellFolderViewDual, (void**)&view); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IDispatch_QueryInterface(disp, &IID_IServiceProvider, (void**)&sp); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&sb); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&sb2); ok(hr == S_OK, "got 0x%08x\n", hr); ok(sb == sb2, "got %p, %p\n", sb, sb2); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IOleWindow, (void**)&unk); ok(hr == S_OK, "got 0x%08x\n", hr); IUnknown_Release(unk); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IExplorerBrowser, (void**)&unk); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellBrowser_QueryInterface(sb, &IID_IExplorerBrowser, (void**)&unk); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellBrowser_QueryInterface(sb, &IID_IWebBrowser2, (void**)&unk); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellBrowser_QueryInterface(sb, &IID_IDispatch, (void**)&unk); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellBrowser_QueryActiveShellView(sb, &sv); ok(hr == S_OK, "got 0x%08x\n", hr); IShellView_Release(sv); IShellBrowser_Release(sb2); IShellBrowser_Release(sb); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IUnknown, (void**)&unk); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IUnknown_QueryInterface(unk, &IID_IShellBrowser, (void**)&sb2); ok(hr == S_OK, "got 0x%08x\n", hr); IShellBrowser_Release(sb2); IUnknown_Release(unk); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IShellView, (void**)&sv); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); IServiceProvider_Release(sp); IDispatch_Release(disp); } disp = (void*)0xdeadbeef; ret = 0xdead; VariantInit(&v); hr = IShellWindows_FindWindowSW(shellwindows, &v, &v, SWC_DESKTOP, &ret, 0, &disp); ok(hr == S_OK || broken(hr == S_FALSE) /* winxp */, "got 0x%08x\n", hr); ok(disp == NULL, "got %p\n", disp); ok(ret != HandleToUlong(hwnd), "got %d\n", ret); disp = (void*)0xdeadbeef; ret = 0xdead; V_VT(&v) = VT_I4; V_I4(&v) = cookie; VariantInit(&v2); hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_BROWSER, &ret, SWFO_COOKIEPASSED, &disp); todo_wine ok(hr == S_FALSE, "got 0x%08x\n", hr); ok(disp == NULL, "got %p\n", disp); ok(ret == 0, "got %d\n", ret); hr = IShellWindows_Revoke(shellwindows, cookie); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); DestroyWindow(hwnd); IShellWindows_Release(shellwindows); }