static void test_IOleWindow(void) { IShellFolder *desktop; IShellView *view; IOleWindow *wnd; HRESULT hr; 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_IOleWindow, (void**)&wnd); ok(hr == E_NOINTERFACE, "got (0x%08x)\n", hr); /* IShellView::ContextSensitiveHelp */ hr = IShellView_ContextSensitiveHelp(view, TRUE); ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); hr = IShellView_ContextSensitiveHelp(view, FALSE); ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); IShellView_Release(view); IShellFolder_Release(desktop); }
static void test_IShellFolderView(void) { IShellFolderView *folderview; IShellFolder *desktop; IShellView *view; IDataObject *obj; UINT i; HRESULT hr; 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_IShellFolderView, (void**)&folderview); if (hr != S_OK) { win_skip("IShellView doesn't provide IShellFolderView on this platform\n"); IShellView_Release(view); IShellFolder_Release(desktop); return; } /* ::MoveIcons */ obj = IDataObjectImpl_Construct(); hr = IShellFolderView_MoveIcons(folderview, obj); ok(hr == E_NOTIMPL || broken(hr == S_OK) /* W98 */, "got (0x%08x)\n", hr); IDataObject_Release(obj); /* ::SetRedraw without list created */ hr = IShellFolderView_SetRedraw(folderview, TRUE); ok(hr == S_OK, "got (0x%08x)\n", hr); /* ::QuerySupport */ hr = IShellFolderView_QuerySupport(folderview, NULL); ok(hr == S_OK, "got (0x%08x)\n", hr); i = 0xdeadbeef; hr = IShellFolderView_QuerySupport(folderview, &i); ok(hr == S_OK, "got (0x%08x)\n", hr); ok(i == 0xdeadbeef, "got %d\n", i); /* ::RemoveObject */ i = 0xdeadbeef; hr = IShellFolderView_RemoveObject(folderview, NULL, &i); ok(hr == S_OK, "got (0x%08x)\n", hr); ok(i == 0 || i == -1 /* Win7 */ || broken(i == 0xdeadbeef) /* Vista, 2k8 */, "got %d\n", i); IShellFolderView_Release(folderview); IShellView_Release(view); IShellFolder_Release(desktop); }
static void test_CreateViewWindow(void) { IShellFolder *desktop; HWND hwnd_view, hwnd2; FOLDERSETTINGS settings; IShellView *view; IDropTarget *dt; HRESULT hr; RECT r = {0}; 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); if (0) { /* crashes on native */ IShellView_CreateViewWindow(view, NULL, &settings, NULL, NULL, NULL); } settings.ViewMode = FVM_ICON; settings.fFlags = 0; hwnd_view = (HWND)0xdeadbeef; hr = IShellView_CreateViewWindow(view, NULL, &settings, NULL, NULL, &hwnd_view); ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr); ok(hwnd_view == 0, "got %p\n", hwnd_view); hwnd_view = (HWND)0xdeadbeef; hr = IShellView_CreateViewWindow(view, NULL, &settings, NULL, &r, &hwnd_view); ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr); ok(hwnd_view == 0, "got %p\n", hwnd_view); hwnd_view = NULL; hr = IShellView_CreateViewWindow(view, NULL, &settings, &test_shellbrowser, &r, &hwnd_view); ok(hr == S_OK, "got (0x%08x)\n", hr); ok(hwnd_view != 0, "got %p\n", hwnd_view); hwnd2 = (HWND)0xdeadbeef; hr = IShellView_CreateViewWindow(view, NULL, &settings, &test_shellbrowser, &r, &hwnd2); ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr); ok(hwnd2 == NULL, "got %p\n", hwnd_view); /* ::DragLeave without drag operation */ hr = IShellView_QueryInterface(view, &IID_IDropTarget, (void**)&dt); ok(hr == S_OK, "got (0x%08x)\n", hr); hr = IDropTarget_DragLeave(dt); ok(hr == S_OK, "got (0x%08x)\n", hr); IDropTarget_Release(dt); IShellView_Release(view); IShellFolder_Release(desktop); }
static void test_GetItemObject(void) { IShellFolder *desktop; IShellView *view; IUnknown *unk; HRESULT hr; 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); /* from documentation three interfaces are supported for SVGIO_BACKGROUND: IContextMenu, IDispatch, IPersistHistory */ hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IContextMenu, (void**)&unk); ok(hr == S_OK, "got (0x%08x)\n", hr); IUnknown_Release(unk); unk = NULL; hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&unk); todo_wine ok(hr == S_OK || broken(hr == E_NOTIMPL) /* NT4 */, "got (0x%08x)\n", hr); if (unk) IUnknown_Release(unk); unk = NULL; hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IPersistHistory, (void**)&unk); todo_wine ok(hr == S_OK || broken(hr == E_NOTIMPL) /* W9x, NT4 */, "got (0x%08x)\n", hr); if (unk) IUnknown_Release(unk); /* example of unsupported interface, base for IPersistHistory */ hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IPersist, (void**)&unk); ok(hr == E_NOINTERFACE || broken(hr == E_NOTIMPL) /* W2K */, "got (0x%08x)\n", hr); IShellView_Release(view); IShellFolder_Release(desktop); }
/************************************************************************** * IShellBrowserImpl_BrowseObject * * See Windows documentation on IShellBrowser::BrowseObject for more details * * This function will override user specified flags and will always * use SBSP_DEFBROWSER and SBSP_DEFMODE. */ static HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface, LPCITEMIDLIST pidl, UINT wFlags) { HRESULT hRes; IShellFolder *psfTmp; IShellView *psvTmp; FileOpenDlgInfos *fodInfos; LPITEMIDLIST pidlTmp; HWND hwndView; HWND hDlgWnd; BOOL bViewHasFocus; RECT rectView; IShellBrowserImpl *This = impl_from_IShellBrowser(iface); TRACE("(%p)(pidl=%p,flags=0x%08x)\n", This, pidl, wFlags); COMDLG32_DumpSBSPFlags(wFlags); fodInfos = get_filedlg_infoptr(This->hwndOwner); /* Format the pidl according to its parameter's category */ if(wFlags & SBSP_RELATIVE) { /* SBSP_RELATIVE A relative pidl (relative from the current folder) */ if(FAILED(hRes = IShellFolder_BindToObject(fodInfos->Shell.FOIShellFolder, pidl, NULL, &IID_IShellFolder, (LPVOID *)&psfTmp))) { ERR("bind to object failed\n"); return hRes; } /* create an absolute pidl */ pidlTmp = COMDLG32_PIDL_ILCombine(fodInfos->ShellInfos.pidlAbsCurrent, pidl); } else if(wFlags & SBSP_PARENT) { /* Browse the parent folder (ignores the pidl) */ pidlTmp = GetParentPidl(fodInfos->ShellInfos.pidlAbsCurrent); psfTmp = GetShellFolderFromPidl(pidlTmp); } else /* SBSP_ABSOLUTE is 0x0000 */ { /* An absolute pidl (relative from the desktop) */ pidlTmp = COMDLG32_PIDL_ILClone(pidl); psfTmp = GetShellFolderFromPidl(pidlTmp); } if(!psfTmp) { ERR("could not browse to folder\n"); return E_FAIL; } /* If the pidl to browse to is equal to the actual pidl ... do nothing and pretend you did it*/ if(COMDLG32_PIDL_ILIsEqual(pidlTmp,fodInfos->ShellInfos.pidlAbsCurrent)) { IShellFolder_Release(psfTmp); COMDLG32_SHFree(pidlTmp); TRACE("keep current folder\n"); return NOERROR; } /* Release the current DataObject */ if (fodInfos->Shell.FOIDataObject) { IDataObject_Release(fodInfos->Shell.FOIDataObject); fodInfos->Shell.FOIDataObject = NULL; } /* Create the associated view */ TRACE("create view object\n"); if(FAILED(hRes = IShellFolder_CreateViewObject(psfTmp, fodInfos->ShellInfos.hwndOwner, &IID_IShellView, (LPVOID *)&psvTmp))) goto error; /* Check if listview has focus */ bViewHasFocus = IsChild(fodInfos->ShellInfos.hwndView,GetFocus()); /* Get the foldersettings from the old view */ if(fodInfos->Shell.FOIShellView) IShellView_GetCurrentInfo(fodInfos->Shell.FOIShellView, &fodInfos->ShellInfos.folderSettings); /* Release the old fodInfos->Shell.FOIShellView and update its value. We have to update this early since ShellView_CreateViewWindow of native shell32 calls OnStateChange and needs the correct view here.*/ if(fodInfos->Shell.FOIShellView) { IShellView_DestroyViewWindow(fodInfos->Shell.FOIShellView); IShellView_Release(fodInfos->Shell.FOIShellView); } fodInfos->Shell.FOIShellView = psvTmp; /* Release old FOIShellFolder and update its value */ if (fodInfos->Shell.FOIShellFolder) IShellFolder_Release(fodInfos->Shell.FOIShellFolder); fodInfos->Shell.FOIShellFolder = psfTmp; /* Release old pidlAbsCurrent and update its value */ COMDLG32_SHFree(fodInfos->ShellInfos.pidlAbsCurrent); fodInfos->ShellInfos.pidlAbsCurrent = pidlTmp; COMDLG32_UpdateCurrentDir(fodInfos); GetWindowRect(GetDlgItem(This->hwndOwner, IDC_SHELLSTATIC), &rectView); MapWindowPoints(0, This->hwndOwner, (LPPOINT)&rectView, 2); /* Create the window */ TRACE("create view window\n"); if(FAILED(hRes = IShellView_CreateViewWindow(psvTmp, NULL, &fodInfos->ShellInfos.folderSettings, fodInfos->Shell.FOIShellBrowser, &rectView, &hwndView))) goto error; fodInfos->ShellInfos.hwndView = hwndView; /* Set view window control id to 5002 */ SetWindowLongPtrW(hwndView, GWLP_ID, lst2); SendMessageW( hwndView, WM_SETFONT, SendMessageW( GetParent(hwndView), WM_GETFONT, 0, 0 ), FALSE ); /* Select the new folder in the Look In combo box of the Open file dialog */ FILEDLG95_LOOKIN_SelectItem(fodInfos->DlgInfos.hwndLookInCB,fodInfos->ShellInfos.pidlAbsCurrent); /* changes the tab order of the ListView to reflect the window's File Dialog */ hDlgWnd = GetDlgItem(GetParent(hwndView), IDC_LOOKIN); SetWindowPos(hwndView, hDlgWnd, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); /* Since we destroyed the old view if it had focus set focus to the newly created view */ if (bViewHasFocus) SetFocus(fodInfos->ShellInfos.hwndView); return hRes; error: ERR("Failed with error 0x%08x\n", hRes); return hRes; }
static void test_GetSetCurrentViewMode(void) { IShellFolder *desktop; IShellView *sview; IFolderView *fview; IShellBrowser *browser; FOLDERSETTINGS fs; UINT viewmode; HWND hwnd; RECT rc = {0, 0, 10, 10}; HRESULT hr; UINT i; static const int winxp_res[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; static const int win2k3_res[11] = {0, 1, 2, 3, 4, 5, 6, 5, 8, 0, 0}; static const int vista_res[11] = {0, 1, 5, 3, 4, 5, 6, 7, 7, 0, 0}; static const int win7_res[11] = {1, 1, 1, 3, 4, 1, 6, 1, 8, 8, 8}; hr = SHGetDesktopFolder(&desktop); ok(hr == S_OK, "got (0x%08x)\n", hr); hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&sview); ok(hr == S_OK, "got (0x%08x)\n", hr); fs.ViewMode = 1; fs.fFlags = 0; browser = IShellBrowserImpl_Construct(); hr = IShellView_CreateViewWindow(sview, NULL, &fs, browser, &rc, &hwnd); ok(hr == S_OK || broken(hr == S_FALSE /*Win2k*/ ), "got (0x%08x)\n", hr); hr = IShellView_QueryInterface(sview, &IID_IFolderView, (void**)&fview); ok(hr == S_OK || broken(hr == E_NOINTERFACE), "got (0x%08x)\n", hr); if(SUCCEEDED(hr)) { HWND hwnd_lv; UINT count; if(0) { /* Crashes under Win7/WinXP */ hr = IFolderView_GetCurrentViewMode(fview, NULL); } hr = IFolderView_GetCurrentViewMode(fview, &viewmode); ok(hr == S_OK, "got (0x%08x)\n", hr); ok(viewmode == 1, "ViewMode was %d\n", viewmode); hr = IFolderView_SetCurrentViewMode(fview, FVM_AUTO); ok(hr == S_OK, "got (0x%08x)\n", hr); hr = IFolderView_SetCurrentViewMode(fview, 0); ok(hr == E_INVALIDARG || broken(hr == S_OK), "got (0x%08x)\n", hr); hr = IFolderView_GetCurrentViewMode(fview, &viewmode); ok(hr == S_OK, "got (0x%08x)\n", hr); for(i = 1; i < 9; i++) { hr = IFolderView_SetCurrentViewMode(fview, i); ok(hr == S_OK || (i == 8 && hr == E_INVALIDARG /*Vista*/), "(%d) got (0x%08x)\n", i, hr); hr = IFolderView_GetCurrentViewMode(fview, &viewmode); ok(hr == S_OK, "(%d) got (0x%08x)\n", i, hr); /* Wine currently behaves like winxp here. */ ok((viewmode == win7_res[i]) || (viewmode == vista_res[i]) || (viewmode == win2k3_res[i]) || (viewmode == winxp_res[i]), "(%d) got %d\n",i , viewmode); } hr = IFolderView_SetCurrentViewMode(fview, 9); ok(hr == E_INVALIDARG || broken(hr == S_OK), "got (0x%08x)\n", hr); /* Test messages */ hwnd_lv = subclass_listview(hwnd); ok(hwnd_lv != NULL, "Failed to subclass listview\n"); if(hwnd_lv) { /* Vista seems to set the viewmode by other means than sending messages. At least no related messages are captured by subclassing. */ BOOL vista_plus = FALSE; static const UINT vista_plus_msgs[] = { WM_SETREDRAW, WM_NOTIFY, WM_NOTIFYFORMAT, WM_QUERYUISTATE, WM_MENUCHAR, WM_WINDOWPOSCHANGING, WM_NCCALCSIZE, WM_WINDOWPOSCHANGED, WM_PARENTNOTIFY, LVM_GETHEADER, 0 }; flush_sequences(sequences, NUM_MSG_SEQUENCES); hr = IFolderView_SetCurrentViewMode(fview, 1); ok(hr == S_OK, "got 0x%08x\n", hr); /* WM_SETREDRAW is not sent in versions before Vista. */ vista_plus = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, WM_SETREDRAW); if(vista_plus) verify_msgs_in(sequences[LISTVIEW_SEQ_INDEX], vista_plus_msgs); else ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_setcurrentviewmode1_2_prevista, "IFolderView::SetCurrentViewMode(1)", TRUE); hr = IFolderView_SetCurrentViewMode(fview, 2); ok(hr == S_OK, "got 0x%08x\n", hr); if(vista_plus) verify_msgs_in(sequences[LISTVIEW_SEQ_INDEX], vista_plus_msgs); else ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_setcurrentviewmode1_2_prevista, "IFolderView::SetCurrentViewMode(2)", TRUE); hr = IFolderView_SetCurrentViewMode(fview, 3); ok(hr == S_OK, "got 0x%08x\n", hr); if(vista_plus) verify_msgs_in(sequences[LISTVIEW_SEQ_INDEX], vista_plus_msgs); else ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_setcurrentviewmode3_prevista, "IFolderView::SetCurrentViewMode(3)", TRUE); hr = IFolderView_SetCurrentViewMode(fview, 4); ok(hr == S_OK, "got 0x%08x\n", hr); if(vista_plus) verify_msgs_in(sequences[LISTVIEW_SEQ_INDEX], vista_plus_msgs); else ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_setcurrentviewmode4_prevista, "IFolderView::SetCurrentViewMode(4)", TRUE); hr = IFolderView_SetCurrentViewMode(fview, 5); ok(hr == S_OK, "got 0x%08x\n", hr); todo_wine { if(vista_plus) { verify_msgs_in(sequences[LISTVIEW_SEQ_INDEX], vista_plus_msgs); } else { count = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, LVM_SETVIEW); ok(count == 1, "LVM_SETVIEW sent %d times.\n", count); count = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, LVM_SETEXTENDEDLISTVIEWSTYLE); ok(count == 1 || count == 2, "LVM_SETEXTENDEDLISTVIEWSTYLE sent %d times.\n", count); flush_sequences(sequences, NUM_MSG_SEQUENCES); } } hr = IFolderView_SetCurrentViewMode(fview, 6); ok(hr == S_OK, "got 0x%08x\n", hr); todo_wine { if(vista_plus) { verify_msgs_in(sequences[LISTVIEW_SEQ_INDEX], vista_plus_msgs); } else { count = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, LVM_SETVIEW); ok(count == 1, "LVM_SETVIEW sent %d times.\n", count); count = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, LVM_SETEXTENDEDLISTVIEWSTYLE); ok(count == 1 || count == 2, "LVM_SETEXTENDEDLISTVIEWSTYLE sent %d times.\n", count); flush_sequences(sequences, NUM_MSG_SEQUENCES); } } hr = IFolderView_SetCurrentViewMode(fview, 7); ok(hr == S_OK, "got 0x%08x\n", hr); todo_wine { if(vista_plus) { verify_msgs_in(sequences[LISTVIEW_SEQ_INDEX], vista_plus_msgs); } else { count = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, LVM_SETVIEW); ok(count == 1, "LVM_SETVIEW sent %d times.\n", count); count = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, LVM_SETEXTENDEDLISTVIEWSTYLE); ok(count == 2, "LVM_SETEXTENDEDLISTVIEWSTYLE sent %d times.\n", count); flush_sequences(sequences, NUM_MSG_SEQUENCES); } } hr = IFolderView_SetCurrentViewMode(fview, 8); ok(hr == S_OK || broken(hr == E_INVALIDARG /* Vista */), "got 0x%08x\n", hr); todo_wine { if(vista_plus) { verify_msgs_in(sequences[LISTVIEW_SEQ_INDEX], vista_plus_msgs); } else { count = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, LVM_SETVIEW); ok(count == 1, "LVM_SETVIEW sent %d times.\n", count); count = get_msg_count(sequences, LISTVIEW_SEQ_INDEX, LVM_SETEXTENDEDLISTVIEWSTYLE); ok(count == 2, "LVM_SETEXTENDEDLISTVIEWSTYLE sent %d times.\n", count); flush_sequences(sequences, NUM_MSG_SEQUENCES); } } hr = IFolderView_GetCurrentViewMode(fview, &viewmode); ok(hr == S_OK, "Failed to get current viewmode.\n"); ok_sequence(sequences, LISTVIEW_SEQ_INDEX, empty_seq, "IFolderView::GetCurrentViewMode", FALSE); } IFolderView_Release(fview); } else {
static void test_IFolderView(void) { IShellFolder *desktop, *folder; FOLDERSETTINGS settings; IShellView *view; IShellBrowser *browser; IFolderView *fv; HWND hwnd_view, hwnd_list; PITEMID_CHILD pidl; HRESULT hr; INT ret, count; POINT pt; LONG ref1, ref2; RECT r; 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_IFolderView, (void**)&fv); if (hr != S_OK) { win_skip("IFolderView not supported by desktop folder\n"); IShellView_Release(view); IShellFolder_Release(desktop); return; } /* call methods before window creation */ hr = IFolderView_GetSpacing(fv, NULL); ok(hr == S_FALSE || broken(hr == S_OK) /* win7 */, "got (0x%08x)\n", hr); pidl = (void*)0xdeadbeef; hr = IFolderView_Item(fv, 0, &pidl); ok(hr == E_INVALIDARG || broken(hr == E_FAIL) /* < Vista */, "got (0x%08x)\n", hr); ok(pidl == 0 || broken(pidl == (void*)0xdeadbeef) /* < Vista */, "got %p\n", pidl); if (0) { /* crashes on Vista and Win2k8 - List not created yet case */ hr = IFolderView_GetSpacing(fv, &pt); /* crashes on XP */ hr = IFolderView_GetSelectionMarkedItem(fv, NULL); hr = IFolderView_GetFocusedItem(fv, NULL); /* crashes on Vista+ */ hr = IFolderView_Item(fv, 0, NULL); } browser = IShellBrowserImpl_Construct(); settings.ViewMode = FVM_ICON; settings.fFlags = 0; hwnd_view = (HWND)0xdeadbeef; r.left = r.top = 0; r.right = r.bottom = 100; hr = IShellView_CreateViewWindow(view, NULL, &settings, browser, &r, &hwnd_view); ok(hr == S_OK, "got (0x%08x)\n", hr); ok(IsWindow(hwnd_view), "got %p\n", hwnd_view); hwnd_list = subclass_listview(hwnd_view); if (!hwnd_list) { win_skip("Failed to subclass ListView control\n"); IShellBrowser_Release(browser); IFolderView_Release(fv); IShellView_Release(view); IShellFolder_Release(desktop); return; } /* IFolderView::GetSpacing */ flush_sequences(sequences, NUM_MSG_SEQUENCES); hr = IFolderView_GetSpacing(fv, NULL); ok(hr == S_OK, "got (0x%08x)\n", hr); ok_sequence(sequences, LISTVIEW_SEQ_INDEX, empty_seq, "IFolderView::GetSpacing, empty", FALSE); flush_sequences(sequences, NUM_MSG_SEQUENCES); hr = IFolderView_GetSpacing(fv, &pt); ok(hr == S_OK, "got (0x%08x)\n", hr); /* fails with empty sequence on win7 for unknown reason */ if (sequences[LISTVIEW_SEQ_INDEX]->count) { ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_getspacing_seq, "IFolderView::GetSpacing", FALSE); ok(pt.x > 0, "got %d\n", pt.x); ok(pt.y > 0, "got %d\n", pt.y); ret = SendMessageA(hwnd_list, LVM_GETITEMSPACING, 0, 0); ok(pt.x == LOWORD(ret) && pt.y == HIWORD(ret), "got (%d, %d)\n", LOWORD(ret), HIWORD(ret)); } /* IFolderView::ItemCount */ if (0) { /* crashes on XP */ hr = IFolderView_ItemCount(fv, SVGIO_ALLVIEW, NULL); } flush_sequences(sequences, NUM_MSG_SEQUENCES); hr = IFolderView_ItemCount(fv, SVGIO_ALLVIEW, &count); ok(hr == S_OK, "got (0x%08x)\n", hr); ok_sequence(sequences, LISTVIEW_SEQ_INDEX, count ? folderview_itemcount_seq : empty_seq, "IFolderView::ItemCount", FALSE); /* IFolderView::GetSelectionMarkedItem */ if (0) { /* crashes on XP */ hr = IFolderView_GetSelectionMarkedItem(fv, NULL); } flush_sequences(sequences, NUM_MSG_SEQUENCES); hr = IFolderView_GetSelectionMarkedItem(fv, &ret); if (count) ok(hr == S_OK, "got (0x%08x)\n", hr); else ok(hr == S_FALSE, "got (0x%08x)\n", hr); ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_getselectionmarked_seq, "IFolderView::GetSelectionMarkedItem", FALSE); /* IFolderView::GetFocusedItem */ flush_sequences(sequences, NUM_MSG_SEQUENCES); hr = IFolderView_GetFocusedItem(fv, &ret); if (count) ok(hr == S_OK, "got (0x%08x)\n", hr); else ok(hr == S_FALSE, "got (0x%08x)\n", hr); ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_getfocused_seq, "IFolderView::GetFocusedItem", FALSE); /* IFolderView::GetFolder, just return pointer */ if (0) { /* crashes on XP */ hr = IFolderView_GetFolder(fv, NULL, (void**)&folder); hr = IFolderView_GetFolder(fv, NULL, NULL); } hr = IFolderView_GetFolder(fv, &IID_IShellFolder, NULL); ok(hr == E_POINTER, "got (0x%08x)\n", hr); ref1 = IShellFolder_AddRef(desktop); IShellFolder_Release(desktop); hr = IFolderView_GetFolder(fv, &IID_IShellFolder, (void**)&folder); ok(hr == S_OK, "got (0x%08x)\n", hr); ref2 = IShellFolder_AddRef(desktop); IShellFolder_Release(desktop); ok(ref1 == ref2 || ref1 + 1 == ref2, /* >= vista */ "expected same refcount, got %d\n", ref2); ok(desktop == folder, "\n"); IShellBrowser_Release(browser); IFolderView_Release(fv); IShellView_Release(view); IShellFolder_Release(desktop); }
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); }