/* Tests for My Network Places */ static void test_parse_for_entire_network(void) { static WCHAR my_network_places_path[] = { ':',':','{','2','0','8','D','2','C','6','0','-','3','A','E','A','-', '1','0','6','9','-','A','2','D','7','-','0','8','0','0','2','B','3','0','3','0','9','D','}', 0 }; static WCHAR entire_network_path[] = { ':',':','{','2','0','8','D','2','C','6','0','-','3','A','E','A','-', '1','0','6','9','-','A','2','D','7','-','0','8','0','0','2','B','3','0','3','0','9','D', '}','\\','E','n','t','i','r','e','N','e','t','w','o','r','k',0 }; IShellFolder *psfDesktop; HRESULT hr; DWORD eaten = 0xdeadbeef; LPITEMIDLIST pidl; DWORD attr = ~0; DWORD expected_attr; hr = SHGetDesktopFolder(&psfDesktop); ok(hr == S_OK, "SHGetDesktopFolder failed with error 0x%x\n", hr); hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, my_network_places_path, &eaten, &pidl, &attr); ok(hr == S_OK, "IShellFolder_ParseDisplayName failed with error 0x%x\n", hr); todo_wine ok(eaten == 0xdeadbeef, "eaten should not have been set to %u\n", eaten); expected_attr = SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME|SFGAO_CANLINK; todo_wine ok((attr == expected_attr) || /* Win9x, NT4 */ (attr == (expected_attr | SFGAO_STREAM)) || /* W2K */ (attr == (expected_attr | SFGAO_CANDELETE)) || /* XP, W2K3 */ (attr == (expected_attr | SFGAO_CANDELETE | SFGAO_NONENUMERATED)), /* Vista */ "Unexpected attributes : %08x\n", attr); ILFree(pidl); /* Start clean again */ eaten = 0xdeadbeef; attr = ~0; hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, entire_network_path, &eaten, &pidl, &attr); IShellFolder_Release(psfDesktop); if (hr == HRESULT_FROM_WIN32(ERROR_BAD_NET_NAME) || hr == HRESULT_FROM_WIN32(ERROR_NO_NET_OR_BAD_PATH) || hr == HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER)) { win_skip("'EntireNetwork' is not available on Win9x, NT4 and Vista\n"); return; } ok(hr == S_OK, "IShellFolder_ParseDisplayName failed with error 0x%x\n", hr); todo_wine ok(eaten == 0xdeadbeef, "eaten should not have been set to %u\n", eaten); expected_attr = SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_HASPROPSHEET|SFGAO_CANLINK; todo_wine ok(attr == expected_attr || /* winme, nt4 */ attr == (expected_attr | SFGAO_STREAM) || /* win2k */ attr == (expected_attr | SFGAO_STORAGEANCESTOR), /* others */ "attr should be 0x%x, not 0x%x\n", expected_attr, attr); ILFree(pidl); }
/* Tests for Control Panel */ static void test_parse_for_control_panel(void) { /* path of My Computer\Control Panel */ static WCHAR control_panel_path[] = { ':',':','{','2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','8','-','0','8','0','0','2','B','3','0','3','0','9','D','}','\\', ':',':','{','2','1','E','C','2','0','2','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','D','-','0','8','0','0','2','B','3','0','3','0','9','D','}', 0 }; IShellFolder *psfDesktop; HRESULT hr; DWORD eaten = 0xdeadbeef; LPITEMIDLIST pidl; DWORD attr = ~0; hr = SHGetDesktopFolder(&psfDesktop); ok(hr == S_OK, "SHGetDesktopFolder failed with error 0x%x\n", hr); hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, control_panel_path, &eaten, &pidl, &attr); ok(hr == S_OK, "IShellFolder_ParseDisplayName failed with error 0x%x\n", hr); todo_wine ok(eaten == 0xdeadbeef, "eaten should not have been set to %u\n", eaten); todo_wine ok((attr == (SFGAO_CANLINK | SFGAO_FOLDER)) || /* Win9x, NT4 */ (attr == (SFGAO_CANLINK | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_STREAM)) || /* W2K */ (attr == (SFGAO_CANLINK | SFGAO_FOLDER | SFGAO_HASSUBFOLDER)) || /* W2K, XP, W2K3 */ (attr == (SFGAO_CANLINK | SFGAO_NONENUMERATED)) || /* Vista */ (attr == SFGAO_CANLINK), /* Vista, W2K8 */ "Unexpected attributes : %08x\n", attr); ILFree(pidl); }
HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes) { LPITEMIDLIST pidlOut = NULL, pidlTemp = NULL; IShellFolder *psfChild; HRESULT hr; TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlInOut ? *pidlInOut : NULL, debugstr_w (szNext)); /* get the shellfolder for the child pidl and let it analyse further */ hr = IShellFolder2_BindToObject (psf, *pidlInOut, pbc, &IID_IShellFolder, (LPVOID *) & psfChild); if (SUCCEEDED(hr)) { hr = IShellFolder_ParseDisplayName (psfChild, hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes); IShellFolder_Release (psfChild); if (SUCCEEDED(hr)) { pidlTemp = ILCombine (*pidlInOut, pidlOut); if (!pidlTemp) hr = E_OUTOFMEMORY; } if (pidlOut) ILFree (pidlOut); } ILFree (*pidlInOut); *pidlInOut = pidlTemp; TRACE ("-- pidl=%p ret=0x%08x\n", pidlInOut ? *pidlInOut : NULL, hr); return hr; }
static IShellFolder* get_starting_shell_folder(parameters_struct* params) { IShellFolder* desktop,*folder; LPITEMIDLIST root_pidl; HRESULT hres; SHGetDesktopFolder(&desktop); if (!params->root[0]) { return desktop; } hres = IShellFolder_ParseDisplayName(desktop,NULL,NULL, params->root,NULL, &root_pidl,NULL); if(FAILED(hres)) { return desktop; } hres = IShellFolder_BindToObject(desktop,root_pidl,NULL, &IID_IShellFolder, (void**)&folder); if(FAILED(hres)) { return desktop; } IShellFolder_Release(desktop); return folder; }
static LRESULT BrsFolder_Treeview_Rename(browse_info *info, NMTVDISPINFOW *pnmtv) { LPTV_ITEMDATA item_data; WCHAR old_path[MAX_PATH], new_path[MAX_PATH], *p; NMTREEVIEWW nmtv; TVITEMW item; if(!pnmtv->item.pszText) return 0; item.mask = TVIF_HANDLE|TVIF_PARAM; item.hItem = (HTREEITEM)SendMessageW(info->hwndTreeView, TVM_GETNEXTITEM, TVGN_CARET, 0); SendMessageW(info->hwndTreeView, TVM_GETITEMW, 0, (LPARAM)&item); item_data = (LPTV_ITEMDATA)item.lParam; SHGetPathFromIDListW(item_data->lpifq, old_path); if(!(p = strrchrW(old_path, '\\'))) return 0; p = new_path+(p-old_path+1); memcpy(new_path, old_path, (p-new_path)*sizeof(WCHAR)); strcpyW(p, pnmtv->item.pszText); if(!MoveFileW(old_path, new_path)) return 0; SHFree(item_data->lpifq); SHFree(item_data->lpi); item_data->lpifq = SHSimpleIDListFromPathW(new_path); IShellFolder_ParseDisplayName(item_data->lpsfParent, NULL, NULL, pnmtv->item.pszText, NULL, &item_data->lpi, NULL); item.mask = TVIF_HANDLE|TVIF_TEXT; item.pszText = pnmtv->item.pszText; SendMessageW(info->hwndTreeView, TVM_SETITEMW, 0, (LPARAM)&item); nmtv.itemNew.lParam = item.lParam; BrsFolder_Treeview_Changed(info, &nmtv); return 0; }
/************************************************************************** * ISF_Desktop_fnParseDisplayName * * NOTES * "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds * to MyComputer */ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface, HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) { IDesktopFolderImpl *This = impl_from_IShellFolder2(iface); IShellFolder *shell_folder = (IShellFolder*)iface; WCHAR szElement[MAX_PATH]; LPCWSTR szNext = NULL; LPITEMIDLIST pidlTemp = NULL; PARSEDURLW urldata; HRESULT hr = S_OK; CLSID clsid; TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", This, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), pchEaten, ppidl, pdwAttributes); if (!ppidl) return E_INVALIDARG; *ppidl = 0; if (!lpszDisplayName) return E_INVALIDARG; if (pchEaten) *pchEaten = 0; /* strange but like the original */ urldata.cbSize = sizeof(urldata); if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':') { szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); TRACE ("-- element: %s\n", debugstr_w (szElement)); SHCLSIDFromStringW (szElement + 2, &clsid); pidlTemp = _ILCreateGuid (PT_GUID, &clsid); } else if (PathGetDriveNumberW (lpszDisplayName) >= 0) { /* it's a filesystem path with a drive. Let MyComputer/UnixDosFolder parse it */ if (UNIXFS_is_rooted_at_desktop()) pidlTemp = _ILCreateGuid(PT_GUID, &CLSID_UnixDosFolder); else pidlTemp = _ILCreateMyComputer (); szNext = lpszDisplayName; } else if (PathIsUNCW(lpszDisplayName)) { pidlTemp = _ILCreateNetwork(); szNext = lpszDisplayName; } else if( (pidlTemp = SHELL32_CreatePidlFromBindCtx(pbc, lpszDisplayName)) ) { *ppidl = pidlTemp; return S_OK; } else if (SUCCEEDED(ParseURLW(lpszDisplayName, &urldata))) { if (urldata.nScheme == URL_SCHEME_SHELL) /* handle shell: urls */ { TRACE ("-- shell url: %s\n", debugstr_w(urldata.pszSuffix)); SHCLSIDFromStringW (urldata.pszSuffix+2, &clsid); pidlTemp = _ILCreateGuid (PT_GUID, &clsid); } else return IEParseDisplayNameWithBCW(CP_ACP,lpszDisplayName,pbc,ppidl); } else { /* it's a filesystem path on the desktop. Let a FSFolder parse it */ if (*lpszDisplayName) { if (*lpszDisplayName == '/') { /* UNIX paths should be parsed by unixfs */ IShellFolder *unixFS; hr = UnixFolder_Constructor(NULL, &IID_IShellFolder, (LPVOID*)&unixFS); if (SUCCEEDED(hr)) { hr = IShellFolder_ParseDisplayName(unixFS, NULL, NULL, lpszDisplayName, NULL, &pidlTemp, NULL); IShellFolder_Release(unixFS); } } else { /* build a complete path to create a simple pidl */ WCHAR szPath[MAX_PATH]; LPWSTR pathPtr; lstrcpynW(szPath, This->sPathTarget, MAX_PATH); pathPtr = PathAddBackslashW(szPath); if (pathPtr) { lstrcpynW(pathPtr, lpszDisplayName, MAX_PATH - (pathPtr - szPath)); hr = _ILCreateFromPathW(szPath, &pidlTemp); } else { /* should never reach here, but for completeness */ hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); } } } else pidlTemp = _ILCreateMyComputer(); szNext = NULL; } if (SUCCEEDED(hr) && pidlTemp) { if (szNext && *szNext) { hr = SHELL32_ParseNextElement(iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); } else { if (pdwAttributes && *pdwAttributes) hr = SHELL32_GetItemAttributes(shell_folder, pidlTemp, pdwAttributes); } } *ppidl = pidlTemp; TRACE ("(%p)->(-- ret=0x%08x)\n", This, hr); return hr; }
static BOOL BrsFolder_OnSetExpanded(browse_info *info, LPVOID selection, BOOL is_str, HTREEITEM *pItem) { LPITEMIDLIST pidlSelection = (LPITEMIDLIST)selection; LPCITEMIDLIST pidlCurrent, pidlRoot; TVITEMEXW item; BOOL bResult = FALSE; /* If 'selection' is a string, convert to a Shell ID List. */ if (is_str) { IShellFolder *psfDesktop; HRESULT hr; hr = SHGetDesktopFolder(&psfDesktop); if (FAILED(hr)) goto done; hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, (LPOLESTR)selection, NULL, &pidlSelection, NULL); IShellFolder_Release(psfDesktop); if (FAILED(hr)) goto done; } /* Move pidlCurrent behind the SHITEMIDs in pidlSelection, which are the root of * the sub-tree currently displayed. */ pidlRoot = info->lpBrowseInfo->pidlRoot; pidlCurrent = pidlSelection; while (!_ILIsEmpty(pidlRoot) && _ILIsEqualSimple(pidlRoot, pidlCurrent)) { pidlRoot = ILGetNext(pidlRoot); pidlCurrent = ILGetNext(pidlCurrent); } /* The given ID List is not part of the SHBrowseForFolder's current sub-tree. */ if (!_ILIsEmpty(pidlRoot)) goto done; /* Initialize item to point to the first child of the root folder. */ memset(&item, 0, sizeof(item)); item.mask = TVIF_PARAM; item.hItem = TreeView_GetRoot(info->hwndTreeView); if (item.hItem) item.hItem = TreeView_GetChild(info->hwndTreeView, item.hItem); /* Walk the tree along the nodes corresponding to the remaining ITEMIDLIST */ while (item.hItem && !_ILIsEmpty(pidlCurrent)) { LPTV_ITEMDATA pItemData; SendMessageW(info->hwndTreeView, TVM_GETITEMW, 0, (LPARAM)&item); pItemData = (LPTV_ITEMDATA)item.lParam; if (_ILIsEqualSimple(pItemData->lpi, pidlCurrent)) { pidlCurrent = ILGetNext(pidlCurrent); if (!_ILIsEmpty(pidlCurrent)) { /* Only expand current node and move on to it's first child, * if we didn't already reach the last SHITEMID */ SendMessageW(info->hwndTreeView, TVM_EXPAND, TVE_EXPAND, (LPARAM)item.hItem); item.hItem = TreeView_GetChild(info->hwndTreeView, item.hItem); } } else { item.hItem = TreeView_GetNextSibling(info->hwndTreeView, item.hItem); } } if (_ILIsEmpty(pidlCurrent) && item.hItem) bResult = TRUE; done: if (pidlSelection && pidlSelection != (LPITEMIDLIST)selection) ILFree(pidlSelection); if (pItem) *pItem = item.hItem; return bResult; }
static HRESULT BrsFolder_NewFolder(browse_info *info) { DWORD flags = BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags); IShellFolder *desktop, *cur; ISFHelper *sfhelper; WCHAR name[MAX_PATH]; HTREEITEM parent, added; LPTV_ITEMDATA item_data; LPITEMIDLIST new_item; TVITEMW item; HRESULT hr; int len; if(!info->pidlRet) { ERR("Make new folder button should be disabled\n"); return E_FAIL; } /* Create new directory */ hr = SHGetDesktopFolder(&desktop); if(FAILED(hr)) return hr; hr = IShellFolder_BindToObject(desktop, info->pidlRet, 0, &IID_IShellFolder, (void**)&cur); IShellFolder_Release(desktop); if(FAILED(hr)) return hr; hr = IShellFolder_QueryInterface(cur, &IID_ISFHelper, (void**)&sfhelper); if(FAILED(hr)) return hr; hr = SHGetPathFromIDListW(info->pidlRet, name); if(FAILED(hr)) goto cleanup; len = strlenW(name); if(len<MAX_PATH) name[len++] = '\\'; hr = ISFHelper_GetUniqueName(sfhelper, &name[len], MAX_PATH-len); ISFHelper_Release(sfhelper); if(FAILED(hr)) goto cleanup; hr = E_FAIL; if(!CreateDirectoryW(name, NULL)) goto cleanup; /* Update parent of newly created directory */ parent = (HTREEITEM)SendMessageW(info->hwndTreeView, TVM_GETNEXTITEM, TVGN_CARET, 0); if(!parent) goto cleanup; SendMessageW(info->hwndTreeView, TVM_EXPAND, TVE_EXPAND, (LPARAM)parent); memset(&item, 0, sizeof(TVITEMW)); item.mask = TVIF_PARAM|TVIF_STATE; item.hItem = parent; SendMessageW(info->hwndTreeView, TVM_GETITEMW, 0, (LPARAM)&item); item_data = (LPTV_ITEMDATA)item.lParam; if(!item_data) goto cleanup; if(item_data->pEnumIL) IEnumIDList_Release(item_data->pEnumIL); hr = IShellFolder_EnumObjects(cur, info->hwndTreeView, flags, &item_data->pEnumIL); if(FAILED(hr)) goto cleanup; /* Update treeview */ if(!(item.state&TVIS_EXPANDEDONCE)) { item.mask = TVIF_STATE; item.state = TVIS_EXPANDEDONCE; item.stateMask = TVIS_EXPANDEDONCE; SendMessageW(info->hwndTreeView, TVM_SETITEMW, 0, (LPARAM)&item); } hr = IShellFolder_ParseDisplayName(cur, NULL, NULL, name+len, NULL, &new_item, NULL); if(FAILED(hr)) goto cleanup; added = InsertTreeViewItem(info, cur, new_item, item_data->lpifq, NULL, parent); IShellFolder_Release(cur); SHFree(new_item); SendMessageW(info->hwndTreeView, TVM_SORTCHILDREN, FALSE, (LPARAM)parent); return BrsFolder_Rename(info, added); cleanup: return hr; }
static void test_ShortcutFolder(void) { LPSHELLFOLDER pDesktopFolder, pWineTestFolder; IPersistFolder3 *pWineTestPersistFolder; LPITEMIDLIST pidlWineTestFolder, pidlCurFolder; HRESULT hr; CLSID clsid; const CLSID CLSID_WineTest = { 0x9b352ebf, 0x2765, 0x45c1, { 0xb4, 0xc6, 0x85, 0xcc, 0x7f, 0x7a, 0xbc, 0x64 } }; WCHAR wszWineTestFolder[] = { ':',':','{','9','B','3','5','2','E','B','F','-','2','7','6','5','-','4','5','C','1','-', 'B','4','C','6','-','8','5','C','C','7','F','7','A','B','C','6','4','}',0 }; /* First, we register all the necessary registry keys/values for our 'WineTest' * shell object. */ register_keys(HKEY_CLASSES_ROOT, HKEY_CLASSES_ROOT_keys, 1); hr = SHGetDesktopFolder(&pDesktopFolder); ok (SUCCEEDED(hr), "SHGetDesktopFolder failed! hr = %08x\n", hr); if (FAILED(hr)) goto cleanup; /* Convert the wszWineTestFolder string to an ITEMIDLIST. */ hr = IShellFolder_ParseDisplayName(pDesktopFolder, NULL, NULL, wszWineTestFolder, NULL, &pidlWineTestFolder, NULL); todo_wine { ok (hr == HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), "Expected %08x, got %08x\n", HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), hr); } if (FAILED(hr)) { IShellFolder_Release(pDesktopFolder); goto cleanup; } /* FIXME: these tests are never run */ /* Bind to a WineTest folder object. There has to be some support for this in shdocvw.dll. * This isn't implemented in wine yet.*/ hr = IShellFolder_BindToObject(pDesktopFolder, pidlWineTestFolder, NULL, &IID_IShellFolder, (LPVOID*)&pWineTestFolder); IShellFolder_Release(pDesktopFolder); ILFree(pidlWineTestFolder); ok (SUCCEEDED(hr), "IShellFolder::BindToObject(WineTestFolder) failed! hr = %08x\n", hr); if (FAILED(hr)) goto cleanup; hr = IShellFolder_QueryInterface(pWineTestFolder, &IID_IPersistFolder3, (LPVOID*)&pWineTestPersistFolder); ok (SUCCEEDED(hr), "IShellFolder::QueryInterface(IPersistFolder3) failed! hr = %08x\n", hr); IShellFolder_Release(pWineTestFolder); if (FAILED(hr)) goto cleanup; /* The resulting folder object has the FolderShortcut CLSID, instead of it's own. */ hr = IPersistFolder3_GetClassID(pWineTestPersistFolder, &clsid); ok (SUCCEEDED(hr), "IPersist::GetClassID failed! hr = %08x\n", hr); ok (IsEqualCLSID(&CLSID_FolderShortcut, &clsid), "GetClassId returned wrong CLSID!\n"); pidlCurFolder = (LPITEMIDLIST)0xdeadbeef; hr = IPersistFolder3_GetCurFolder(pWineTestPersistFolder, &pidlCurFolder); ok (SUCCEEDED(hr), "IPersistFolder3::GetCurFolder failed! hr = %08x\n", hr); ok (pidlCurFolder->mkid.cb == 20 && ((LPSHITEMID)((BYTE*)pidlCurFolder+20))->cb == 0 && IsEqualCLSID(&CLSID_WineTest, (REFCLSID)((LPBYTE)pidlCurFolder+4)), "GetCurFolder returned unexpected pidl!\n"); ILFree(pidlCurFolder); IPersistFolder3_Release(pWineTestPersistFolder); cleanup: unregister_keys(HKEY_CLASSES_ROOT, HKEY_CLASSES_ROOT_keys, 1); }
static void test_ShellFolderViewDual(void) { static const IID *shelldisp_riids[] = { &IID_IShellDispatch6, &IID_IShellDispatch5, &IID_IShellDispatch4, &IID_NULL }; IShellFolderViewDual *viewdual; IShellFolder *desktop, *tmpdir; IShellView *view, *view2; IDispatch *disp, *disp2; WCHAR pathW[MAX_PATH]; LPITEMIDLIST pidl; HRESULT hr; /* IShellFolderViewDual is not an IShellView extension */ hr = SHGetDesktopFolder(&desktop); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellView_QueryInterface(view, &IID_IShellFolderViewDual, (void**)&viewdual); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&disp); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&disp2); ok(hr == S_OK, "got 0x%08x\n", hr); ok(disp2 == disp, "got %p, %p\n", disp2, disp); IDispatch_Release(disp2); hr = IDispatch_QueryInterface(disp, &IID_IShellFolderViewDual, (void**)&viewdual); ok(hr == S_OK, "got 0x%08x\n", hr); ok(disp == (IDispatch*)viewdual, "got %p, expected %p\n", viewdual, disp); hr = IShellFolderViewDual_QueryInterface(viewdual, &IID_IShellView, (void**)&view2); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); /* get_Application() */ if (0) { /* crashes on pre-vista */ hr = IShellFolderViewDual_get_Application(viewdual, NULL); ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); } hr = IShellFolderViewDual_get_Application(viewdual, &disp2); ok(hr == S_OK, "got 0x%08x\n", hr); ok(disp2 != (IDispatch*)viewdual, "got %p, %p\n", disp2, viewdual); test_dispatch_typeinfo(disp2, shelldisp_riids); IDispatch_Release(disp2); IShellFolderViewDual_Release(viewdual); IDispatch_Release(disp); disp = (void*)0xdeadbeef; hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IShellFolderViewDual, (void**)&disp); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); ok(disp == NULL, "got %p\n", disp); IShellView_Release(view); /* Try with some other folder, that's not a desktop */ GetTempPathW(sizeof(pathW)/sizeof(pathW[0]), pathW); hr = IShellFolder_ParseDisplayName(desktop, NULL, NULL, pathW, NULL, &pidl, NULL); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellFolder_BindToObject(desktop, pidl, NULL, &IID_IShellFolder, (void**)&tmpdir); ok(hr == S_OK, "got 0x%08x\n", hr); CoTaskMemFree(pidl); hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellView_QueryInterface(view, &IID_IShellFolderViewDual, (void**)&viewdual); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&disp); ok(hr == S_OK, "got 0x%08x\n", hr); IDispatch_Release(disp); IShellView_Release(view); IShellFolder_Release(tmpdir); IShellFolder_Release(desktop); }