2 * Unit tests for the Common Item Dialog
4 * Copyright 2010,2011 David Hedberg
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include "wine/test.h"
28 static HRESULT (WINAPI *pSHCreateShellItem)(LPCITEMIDLIST,IShellFolder*,LPCITEMIDLIST,IShellItem**);
29 static HRESULT (WINAPI *pSHGetIDListFromObject)(IUnknown*, PIDLIST_ABSOLUTE*);
31 static void init_function_pointers(void)
33 HMODULE hmod = GetModuleHandleA("shell32.dll");
35 #define MAKEFUNC(f) (p##f = (void*)GetProcAddress(hmod, #f))
36 MAKEFUNC(SHCreateShellItem);
37 MAKEFUNC(SHGetIDListFromObject);
41 /**************************************************************************
42 * IFileDialogEvents implementation
45 IFileDialogEvents IFileDialogEvents_iface;
47 } IFileDialogEventsImpl;
49 static inline IFileDialogEventsImpl *impl_from_IFileDialogEvents(IFileDialogEvents *iface)
51 return CONTAINING_RECORD(iface, IFileDialogEventsImpl, IFileDialogEvents_iface);
54 static HRESULT WINAPI IFileDialogEvents_fnQueryInterface(IFileDialogEvents *iface, REFIID riid, void **ppv)
57 ok(0, "Unexpectedly called.\n");
61 static ULONG WINAPI IFileDialogEvents_fnAddRef(IFileDialogEvents *iface)
63 IFileDialogEventsImpl *This = impl_from_IFileDialogEvents(iface);
64 return InterlockedIncrement(&This->ref);
67 static ULONG WINAPI IFileDialogEvents_fnRelease(IFileDialogEvents *iface)
69 IFileDialogEventsImpl *This = impl_from_IFileDialogEvents(iface);
70 LONG ref = InterlockedDecrement(&This->ref);
73 HeapFree(GetProcessHeap(), 0, This);
78 static HRESULT WINAPI IFileDialogEvents_fnOnFileOk(IFileDialogEvents *iface, IFileDialog *pfd)
80 ok(0, "Unexpectedly called.\n");
84 static HRESULT WINAPI IFileDialogEvents_fnOnFolderChanging(IFileDialogEvents *iface,
86 IShellItem *psiFolder)
88 ok(0, "Unexpectedly called.\n");
92 static HRESULT WINAPI IFileDialogEvents_fnOnFolderChange(IFileDialogEvents *iface, IFileDialog *pfd)
94 ok(0, "Unexpectedly called.\n");
98 static HRESULT WINAPI IFileDialogEvents_fnOnSelectionChange(IFileDialogEvents *iface, IFileDialog *pfd)
100 ok(0, "Unexpectedly called.\n");
104 static HRESULT WINAPI IFileDialogEvents_fnOnShareViolation(IFileDialogEvents *iface,
107 FDE_SHAREVIOLATION_RESPONSE *pResponse)
109 ok(0, "Unexpectedly called.\n");
113 static HRESULT WINAPI IFileDialogEvents_fnOnTypeChange(IFileDialogEvents *iface, IFileDialog *pfd)
115 ok(0, "Unexpectedly called.\n");
119 static HRESULT WINAPI IFileDialogEvents_fnOnOverwrite(IFileDialogEvents *iface,
122 FDE_OVERWRITE_RESPONSE *pResponse)
124 ok(0, "Unexpectedly called.\n");
128 static const IFileDialogEventsVtbl vt_IFileDialogEvents = {
129 IFileDialogEvents_fnQueryInterface,
130 IFileDialogEvents_fnAddRef,
131 IFileDialogEvents_fnRelease,
132 IFileDialogEvents_fnOnFileOk,
133 IFileDialogEvents_fnOnFolderChanging,
134 IFileDialogEvents_fnOnFolderChange,
135 IFileDialogEvents_fnOnSelectionChange,
136 IFileDialogEvents_fnOnShareViolation,
137 IFileDialogEvents_fnOnTypeChange,
138 IFileDialogEvents_fnOnOverwrite
141 static IFileDialogEvents *IFileDialogEvents_Constructor(void)
143 IFileDialogEventsImpl *This;
145 This = HeapAlloc(GetProcessHeap(), 0, sizeof(IFileDialogEventsImpl));
146 This->IFileDialogEvents_iface.lpVtbl = &vt_IFileDialogEvents;
149 return &This->IFileDialogEvents_iface;
152 static BOOL test_instantiation(void)
155 IFileOpenDialog *pfod;
156 IFileSaveDialog *pfsd;
157 IServiceProvider *psp;
161 /* Instantiate FileOpenDialog */
162 hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
163 &IID_IFileOpenDialog, (void**)&pfod);
166 skip("Could not instantiate the FileOpenDialog.\n");
169 ok(hr == S_OK, "got 0x%08x.\n", hr);
171 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialog, (void**)&pfd);
172 ok(hr == S_OK, "got 0x%08x.\n", hr);
173 if(SUCCEEDED(hr)) IFileDialog_Release(pfd);
175 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialogCustomize, (void**)&pfd);
176 todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
177 if(SUCCEEDED(hr)) IFileDialog_Release(pfd);
179 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileSaveDialog, (void**)&pfsd);
180 ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
181 if(SUCCEEDED(hr)) IFileOpenDialog_Release(pfsd);
183 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IServiceProvider, (void**)&psp);
184 todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
187 IExplorerBrowser *peb;
190 hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IExplorerBrowser, (void**)&peb);
191 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
192 if(SUCCEEDED(hr)) IExplorerBrowser_Release(peb);
193 hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&psb);
194 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
195 if(SUCCEEDED(hr)) IShellBrowser_Release(psb);
196 hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_ICommDlgBrowser, (void**)&punk);
197 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
198 if(SUCCEEDED(hr)) IUnknown_Release(punk);
199 hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_ICommDlgBrowser, (void**)&punk);
200 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
201 if(SUCCEEDED(hr)) IUnknown_Release(punk);
203 IServiceProvider_Release(psp);
206 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialogEvents, (void**)&pfd);
207 ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
208 if(SUCCEEDED(hr)) IFileDialogEvents_Release(pfd);
210 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IExplorerBrowser, (void**)&punk);
211 ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
212 if(SUCCEEDED(hr)) IUnknown_Release(punk);
214 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IExplorerBrowserEvents, (void**)&punk);
215 todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
216 if(SUCCEEDED(hr)) IUnknown_Release(punk);
218 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IShellBrowser, (void**)&punk);
219 ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
220 if(SUCCEEDED(hr)) IUnknown_Release(punk);
222 IFileOpenDialog_Release(pfod);
224 /* Instantiate FileSaveDialog */
225 hr = CoCreateInstance(&CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER,
226 &IID_IFileSaveDialog, (void**)&pfsd);
229 skip("Could not instantiate the FileSaveDialog.\n");
232 ok(hr == S_OK, "got 0x%08x.\n", hr);
234 hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialog, (void**)&pfd);
235 ok(hr == S_OK, "got 0x%08x.\n", hr);
236 if(SUCCEEDED(hr)) IFileDialog_Release(pfd);
238 hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialogCustomize, (void**)&pfd);
239 todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
240 if(SUCCEEDED(hr)) IFileDialogCustomize_Release(pfd);
242 hr = IFileOpenDialog_QueryInterface(pfsd, &IID_IFileOpenDialog, (void**)&pfod);
243 ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
244 if(SUCCEEDED(hr)) IFileOpenDialog_Release(pfod);
246 hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialogEvents, (void**)&pfd);
247 ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
248 if(SUCCEEDED(hr)) IFileDialogEvents_Release(pfd);
250 hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IExplorerBrowser, (void**)&punk);
251 ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
252 if(SUCCEEDED(hr)) IUnknown_Release(punk);
254 hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IExplorerBrowserEvents, (void**)&punk);
255 todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
256 if(SUCCEEDED(hr)) IUnknown_Release(punk);
258 hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IShellBrowser, (void**)&punk);
259 ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
260 if(SUCCEEDED(hr)) IUnknown_Release(punk);
262 IFileSaveDialog_Release(pfsd);
266 static void test_basics(void)
268 IFileOpenDialog *pfod;
269 IFileSaveDialog *pfsd;
271 FILEOPENDIALOGOPTIONS fdoptions;
272 IShellFolder *psfdesktop;
273 IShellItem *psi, *psidesktop, *psi_original;
274 IShellItemArray *psia;
280 const WCHAR txt[] = {'t','x','t', 0};
281 const WCHAR null[] = {0};
282 const WCHAR fname1[] = {'f','n','a','m','e','1', 0};
283 const WCHAR fspec1[] = {'*','.','t','x','t',0};
284 const WCHAR fname2[] = {'f','n','a','m','e','2', 0};
285 const WCHAR fspec2[] = {'*','.','e','x','e',0};
286 COMDLG_FILTERSPEC filterspec[2] = {{fname1, fspec1}, {fname2, fspec2}};
288 /* This should work on every platform with IFileDialog */
289 SHGetDesktopFolder(&psfdesktop);
290 hr = pSHGetIDListFromObject((IUnknown*)psfdesktop, &pidl);
293 hr = pSHCreateShellItem(NULL, NULL, pidl, &psidesktop);
296 IShellFolder_Release(psfdesktop);
299 skip("Failed to get ShellItem from DesktopFolder, skipping tests.\n");
304 /* Instantiate FileOpenDialog and FileSaveDialog */
305 hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
306 &IID_IFileOpenDialog, (void**)&pfod);
307 ok(hr == S_OK, "got 0x%08x.\n", hr);
308 hr = CoCreateInstance(&CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER,
309 &IID_IFileSaveDialog, (void**)&pfsd);
310 ok(hr == S_OK, "got 0x%08x.\n", hr);
312 /* ClearClientData */
315 hr = IFileOpenDialog_ClearClientData(pfod);
316 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
317 hr = IFileSaveDialog_ClearClientData(pfsd);
318 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
322 hr = IFileOpenDialog_GetOptions(pfod, NULL);
323 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
324 hr = IFileSaveDialog_GetOptions(pfsd, NULL);
325 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
327 /* Check default options */
328 hr = IFileOpenDialog_GetOptions(pfod, &fdoptions);
329 ok(hr == S_OK, "got 0x%08x.\n", hr);
330 ok(fdoptions == (FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST | FOS_NOCHANGEDIR),
331 "Unexpected default options: 0x%08x\n", fdoptions);
332 hr = IFileSaveDialog_GetOptions(pfsd, &fdoptions);
333 ok(hr == S_OK, "got 0x%08x.\n", hr);
334 ok(fdoptions == (FOS_OVERWRITEPROMPT | FOS_NOREADONLYRETURN | FOS_PATHMUSTEXIST | FOS_NOCHANGEDIR),
335 "Unexpected default options: 0x%08x\n", fdoptions);
338 hr = IFileOpenDialog_GetResult(pfod, NULL);
339 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
340 hr = IFileSaveDialog_GetResult(pfsd, NULL);
341 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
343 psi = (void*)0xdeadbeef;
344 hr = IFileOpenDialog_GetResult(pfod, &psi);
345 ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
346 ok(psi == (void*)0xdeadbeef, "got %p.\n", psi);
347 psi = (void*)0xdeadbeef;
348 hr = IFileSaveDialog_GetResult(pfsd, &psi);
349 ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
350 ok(psi == (void*)0xdeadbeef, "got %p.\n", psi);
352 /* GetCurrentSelection */
354 /* Crashes on Vista/W2K8. Tests below passes on Windows 7 */
355 hr = IFileOpenDialog_GetCurrentSelection(pfod, NULL);
356 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
357 hr = IFileSaveDialog_GetCurrentSelection(pfsd, NULL);
358 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
359 hr = IFileOpenDialog_GetCurrentSelection(pfod, &psi);
360 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
361 hr = IFileSaveDialog_GetCurrentSelection(pfsd, &psi);
362 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
368 hr = IFileOpenDialog_GetFileName(pfod, NULL);
369 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
370 filename = (void*)0xdeadbeef;
371 hr = IFileOpenDialog_GetFileName(pfod, &filename);
372 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
373 ok(filename == NULL, "got %p\n", filename);
374 hr = IFileSaveDialog_GetFileName(pfsd, NULL);
375 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
376 filename = (void*)0xdeadbeef;
377 hr = IFileSaveDialog_GetFileName(pfsd, &filename);
378 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
379 ok(filename == NULL, "got %p\n", filename);
382 /* GetFileTypeIndex */
383 hr = IFileOpenDialog_GetFileTypeIndex(pfod, NULL);
384 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
386 hr = IFileOpenDialog_GetFileTypeIndex(pfod, &filetype);
387 ok(hr == S_OK, "got 0x%08x.\n", hr);
388 ok(filetype == 0, "got %d.\n", filetype);
389 hr = IFileSaveDialog_GetFileTypeIndex(pfsd, NULL);
390 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
392 hr = IFileSaveDialog_GetFileTypeIndex(pfsd, &filetype);
393 ok(hr == S_OK, "got 0x%08x.\n", hr);
394 ok(filetype == 0, "got %d.\n", filetype);
396 /* SetFileTypes / SetFileTypeIndex */
397 hr = IFileOpenDialog_SetFileTypes(pfod, 0, NULL);
398 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
399 hr = IFileOpenDialog_SetFileTypes(pfod, 0, filterspec);
400 ok(hr == S_OK, "got 0x%08x.\n", hr);
402 hr = IFileOpenDialog_SetFileTypeIndex(pfod, -1);
403 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
404 hr = IFileOpenDialog_SetFileTypeIndex(pfod, 0);
405 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
406 hr = IFileOpenDialog_SetFileTypeIndex(pfod, 1);
407 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
408 hr = IFileOpenDialog_SetFileTypes(pfod, 1, filterspec);
409 ok(hr == S_OK, "got 0x%08x.\n", hr);
410 hr = IFileOpenDialog_SetFileTypes(pfod, 0, filterspec);
411 ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
412 hr = IFileOpenDialog_SetFileTypeIndex(pfod, 0);
413 ok(hr == S_OK, "got 0x%08x.\n", hr);
414 hr = IFileOpenDialog_SetFileTypeIndex(pfod, 100);
415 ok(hr == S_OK, "got 0x%08x.\n", hr);
416 hr = IFileOpenDialog_SetFileTypes(pfod, 1, filterspec);
417 ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
418 hr = IFileOpenDialog_SetFileTypes(pfod, 1, &filterspec[1]);
419 ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
421 hr = IFileSaveDialog_SetFileTypeIndex(pfsd, -1);
422 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
423 hr = IFileSaveDialog_SetFileTypeIndex(pfsd, 0);
424 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
425 hr = IFileSaveDialog_SetFileTypeIndex(pfsd, 1);
426 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
427 hr = IFileSaveDialog_SetFileTypes(pfsd, 1, filterspec);
428 ok(hr == S_OK, "got 0x%08x.\n", hr);
429 hr = IFileSaveDialog_SetFileTypeIndex(pfsd, 0);
430 ok(hr == S_OK, "got 0x%08x.\n", hr);
431 hr = IFileSaveDialog_SetFileTypeIndex(pfsd, 100);
432 ok(hr == S_OK, "got 0x%08x.\n", hr);
433 hr = IFileSaveDialog_SetFileTypes(pfsd, 1, filterspec);
434 ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
435 hr = IFileSaveDialog_SetFileTypes(pfsd, 1, &filterspec[1]);
436 ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
441 hr = IFileOpenDialog_SetFilter(pfod, NULL);
442 ok(hr == S_OK, "got 0x%08x.\n", hr);
443 hr = IFileSaveDialog_SetFilter(pfsd, NULL);
444 ok(hr == S_OK, "got 0x%08x.\n", hr);
448 hr = IFileOpenDialog_SetFolder(pfod, NULL);
449 ok(hr == S_OK, "got 0x%08x.\n", hr);
450 hr = IFileSaveDialog_SetFolder(pfsd, NULL);
451 ok(hr == S_OK, "got 0x%08x.\n", hr);
453 /* SetDefaultExtension */
456 hr = IFileOpenDialog_SetDefaultExtension(pfod, NULL);
457 ok(hr == S_OK, "got 0x%08x.\n", hr);
458 hr = IFileOpenDialog_SetDefaultExtension(pfod, txt);
459 ok(hr == S_OK, "got 0x%08x.\n", hr);
460 hr = IFileOpenDialog_SetDefaultExtension(pfod, null);
461 ok(hr == S_OK, "got 0x%08x.\n", hr);
463 hr = IFileSaveDialog_SetDefaultExtension(pfsd, NULL);
464 ok(hr == S_OK, "got 0x%08x.\n", hr);
465 hr = IFileSaveDialog_SetDefaultExtension(pfsd, txt);
466 ok(hr == S_OK, "got 0x%08x.\n", hr);
467 hr = IFileSaveDialog_SetDefaultExtension(pfsd, null);
468 ok(hr == S_OK, "got 0x%08x.\n", hr);
471 /* SetDefaultFolder */
472 hr = IFileOpenDialog_SetDefaultFolder(pfod, NULL);
473 ok(hr == S_OK, "got 0x%08x\n", hr);
474 hr = IFileSaveDialog_SetDefaultFolder(pfsd, NULL);
475 ok(hr == S_OK, "got 0x%08x\n", hr);
477 hr = IFileOpenDialog_SetDefaultFolder(pfod, psidesktop);
478 ok(hr == S_OK, "got 0x%08x\n", hr);
479 hr = IFileSaveDialog_SetDefaultFolder(pfsd, psidesktop);
480 ok(hr == S_OK, "got 0x%08x\n", hr);
484 /* Crashes under Windows 7 */
485 IFileOpenDialog_SetDefaultFolder(pfod, (void*)0x1234);
486 IFileSaveDialog_SetDefaultFolder(pfsd, (void*)0x1234);
489 /* GetFolder / SetFolder */
490 hr = IFileOpenDialog_GetFolder(pfod, NULL);
491 ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
493 hr = IFileOpenDialog_GetFolder(pfod, &psi_original);
494 ok(hr == S_OK, "got 0x%08x.\n", hr);
497 hr = IFileOpenDialog_SetFolder(pfod, psidesktop);
498 ok(hr == S_OK, "got 0x%08x.\n", hr);
499 hr = IFileOpenDialog_SetFolder(pfod, psi_original);
500 ok(hr == S_OK, "got 0x%08x.\n", hr);
501 IShellItem_Release(psi_original);
504 hr = IFileSaveDialog_GetFolder(pfsd, &psi_original);
505 ok(hr == S_OK, "got 0x%08x.\n", hr);
508 hr = IFileSaveDialog_SetFolder(pfsd, psidesktop);
509 ok(hr == S_OK, "got 0x%08x.\n", hr);
510 hr = IFileSaveDialog_SetFolder(pfsd, psi_original);
511 ok(hr == S_OK, "got 0x%08x.\n", hr);
512 IShellItem_Release(psi_original);
518 /* Crashes under Windows 7 */
519 IFileOpenDialog_AddPlace(pfod, NULL, 0);
520 IFileSaveDialog_AddPlace(pfsd, NULL, 0);
525 hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_TOP + 1);
526 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
527 hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_BOTTOM);
528 ok(hr == S_OK, "got 0x%08x\n", hr);
529 hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_TOP);
530 ok(hr == S_OK, "got 0x%08x\n", hr);
532 hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_TOP + 1);
533 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
534 hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_BOTTOM);
535 ok(hr == S_OK, "got 0x%08x\n", hr);
536 hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_TOP);
537 ok(hr == S_OK, "got 0x%08x\n", hr);
543 hr = IFileOpenDialog_SetFileName(pfod, NULL);
544 ok(hr == S_OK, "got 0x%08x\n", hr);
545 hr = IFileOpenDialog_SetFileName(pfod, null);
546 ok(hr == S_OK, "got 0x%08x\n", hr);
547 hr = IFileOpenDialog_SetFileName(pfod, txt);
548 ok(hr == S_OK, "got 0x%08x\n", hr);
550 hr = IFileSaveDialog_SetFileName(pfsd, NULL);
551 ok(hr == S_OK, "got 0x%08x\n", hr);
552 hr = IFileSaveDialog_SetFileName(pfsd, null);
553 ok(hr == S_OK, "got 0x%08x\n", hr);
554 hr = IFileSaveDialog_SetFileName(pfsd, txt);
555 ok(hr == S_OK, "got 0x%08x\n", hr);
558 /* SetFileNameLabel */
561 hr = IFileOpenDialog_SetFileNameLabel(pfod, NULL);
562 ok(hr == S_OK, "got 0x%08x\n", hr);
563 hr = IFileOpenDialog_SetFileNameLabel(pfod, null);
564 ok(hr == S_OK, "got 0x%08x\n", hr);
565 hr = IFileOpenDialog_SetFileNameLabel(pfod, txt);
566 ok(hr == S_OK, "got 0x%08x\n", hr);
568 hr = IFileSaveDialog_SetFileNameLabel(pfsd, NULL);
569 ok(hr == S_OK, "got 0x%08x\n", hr);
570 hr = IFileSaveDialog_SetFileNameLabel(pfsd, null);
571 ok(hr == S_OK, "got 0x%08x\n", hr);
572 hr = IFileSaveDialog_SetFileNameLabel(pfsd, txt);
573 ok(hr == S_OK, "got 0x%08x\n", hr);
579 hr = IFileOpenDialog_Close(pfod, S_FALSE);
580 ok(hr == S_OK, "got 0x%08x\n", hr);
581 hr = IFileSaveDialog_Close(pfsd, S_FALSE);
582 ok(hr == S_OK, "got 0x%08x\n", hr);
585 /* SetOkButtonLabel */
588 hr = IFileOpenDialog_SetOkButtonLabel(pfod, NULL);
589 ok(hr == S_OK, "got 0x%08x\n", hr);
590 hr = IFileOpenDialog_SetOkButtonLabel(pfod, null);
591 ok(hr == S_OK, "got 0x%08x\n", hr);
592 hr = IFileOpenDialog_SetOkButtonLabel(pfod, txt);
593 ok(hr == S_OK, "got 0x%08x\n", hr);
594 hr = IFileSaveDialog_SetOkButtonLabel(pfsd, NULL);
595 ok(hr == S_OK, "got 0x%08x\n", hr);
596 hr = IFileSaveDialog_SetOkButtonLabel(pfsd, null);
597 ok(hr == S_OK, "got 0x%08x\n", hr);
598 hr = IFileSaveDialog_SetOkButtonLabel(pfsd, txt);
599 ok(hr == S_OK, "got 0x%08x\n", hr);
605 hr = IFileOpenDialog_SetTitle(pfod, NULL);
606 ok(hr == S_OK, "got 0x%08x\n", hr);
607 hr = IFileOpenDialog_SetTitle(pfod, null);
608 ok(hr == S_OK, "got 0x%08x\n", hr);
609 hr = IFileOpenDialog_SetTitle(pfod, txt);
610 ok(hr == S_OK, "got 0x%08x\n", hr);
611 hr = IFileSaveDialog_SetTitle(pfsd, NULL);
612 ok(hr == S_OK, "got 0x%08x\n", hr);
613 hr = IFileSaveDialog_SetTitle(pfsd, null);
614 ok(hr == S_OK, "got 0x%08x\n", hr);
615 hr = IFileSaveDialog_SetTitle(pfsd, txt);
616 ok(hr == S_OK, "got 0x%08x\n", hr);
619 /** IFileOpenDialog specific **/
624 /* Crashes under Windows 7 */
625 IFileOpenDialog_GetResults(pfod, NULL);
627 psia = (void*)0xdeadbeef;
628 hr = IFileOpenDialog_GetResults(pfod, &psia);
629 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
630 ok(psia == NULL, "got %p.\n", psia);
632 /* GetSelectedItems */
635 /* Crashes under W2K8 */
636 hr = IFileOpenDialog_GetSelectedItems(pfod, NULL);
637 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
638 psia = (void*)0xdeadbeef;
639 hr = IFileOpenDialog_GetSelectedItems(pfod, &psia);
640 ok(hr == E_FAIL, "got 0x%08x.\n", hr);
641 ok(psia == (void*)0xdeadbeef, "got %p.\n", psia);
644 /** IFileSaveDialog specific **/
646 /* ApplyProperties */
649 /* Crashes under windows 7 */
650 IFileSaveDialog_ApplyProperties(pfsd, NULL, NULL, NULL, NULL);
651 IFileSaveDialog_ApplyProperties(pfsd, psidesktop, NULL, NULL, NULL);
655 hr = IFileSaveDialog_GetProperties(pfsd, NULL);
656 todo_wine ok(hr == E_UNEXPECTED, "got 0x%08x\n", hr);
657 pps = (void*)0xdeadbeef;
658 hr = IFileSaveDialog_GetProperties(pfsd, &pps);
659 todo_wine ok(hr == E_UNEXPECTED, "got 0x%08x\n", hr);
660 ok(pps == (void*)0xdeadbeef, "got %p\n", pps);
665 /* Crashes under W2K8 */
666 hr = IFileSaveDialog_SetProperties(pfsd, NULL);
667 ok(hr == S_OK, "got 0x%08x\n", hr);
670 /* SetCollectedProperties */
673 hr = IFileSaveDialog_SetCollectedProperties(pfsd, NULL, TRUE);
674 ok(hr == S_OK, "got 0x%08x\n", hr);
675 hr = IFileSaveDialog_SetCollectedProperties(pfsd, NULL, FALSE);
676 ok(hr == S_OK, "got 0x%08x\n", hr);
682 hr = IFileSaveDialog_SetSaveAsItem(pfsd, NULL);
683 ok(hr == S_OK, "got 0x%08x\n", hr);
684 hr = IFileSaveDialog_SetSaveAsItem(pfsd, psidesktop);
685 ok(hr == MK_E_NOOBJECT, "got 0x%08x\n", hr);
690 hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialog2, (void**)&pfd2);
691 ok((hr == S_OK) || broken(hr == E_NOINTERFACE), "got 0x%08x\n", hr);
694 /* SetCancelButtonLabel */
697 hr = IFileDialog2_SetOkButtonLabel(pfd2, NULL);
698 ok(hr == S_OK, "got 0x%08x\n", hr);
699 hr = IFileDialog2_SetOkButtonLabel(pfd2, null);
700 ok(hr == S_OK, "got 0x%08x\n", hr);
701 hr = IFileDialog2_SetOkButtonLabel(pfd2, txt);
702 ok(hr == S_OK, "got 0x%08x\n", hr);
705 /* SetNavigationRoot */
708 hr = IFileDialog2_SetNavigationRoot(pfd2, NULL);
709 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
710 hr = IFileDialog2_SetNavigationRoot(pfd2, psidesktop);
711 ok(hr == S_OK, "got 0x%08x\n", hr);
714 IFileDialog2_Release(pfd2);
717 hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialog2, (void**)&pfd2);
718 ok((hr == S_OK) || broken(hr == E_NOINTERFACE), "got 0x%08x\n", hr);
721 /* SetCancelButtonLabel */
724 hr = IFileDialog2_SetOkButtonLabel(pfd2, NULL);
725 ok(hr == S_OK, "got 0x%08x\n", hr);
726 hr = IFileDialog2_SetOkButtonLabel(pfd2, null);
727 ok(hr == S_OK, "got 0x%08x\n", hr);
728 hr = IFileDialog2_SetOkButtonLabel(pfd2, txt);
729 ok(hr == S_OK, "got 0x%08x\n", hr);
732 /* SetNavigationRoot */
735 hr = IFileDialog2_SetNavigationRoot(pfd2, NULL);
736 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
737 hr = IFileDialog2_SetNavigationRoot(pfd2, psidesktop);
738 ok(hr == S_OK, "got 0x%08x\n", hr);
741 IFileDialog2_Release(pfd2);
745 IShellItem_Release(psidesktop);
746 IFileOpenDialog_Release(pfod);
747 IFileSaveDialog_Release(pfsd);
750 static void test_advise_helper(IFileDialog *pfd)
752 IFileDialogEventsImpl *pfdeimpl;
753 IFileDialogEvents *pfde;
758 pfde = IFileDialogEvents_Constructor();
759 pfdeimpl = impl_from_IFileDialogEvents(pfde);
761 hr = IFileDialog_Advise(pfd, NULL, NULL);
762 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
763 hr = IFileDialog_Advise(pfd, pfde, NULL);
764 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
765 hr = IFileDialog_Advise(pfd, NULL, &cookie[0]);
766 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
767 ok(pfdeimpl->ref == 1, "got ref %d\n", pfdeimpl->ref);
769 hr = IFileDialog_Unadvise(pfd, 0);
770 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
771 for(i = 0; i < 10; i++) {
772 hr = IFileDialog_Advise(pfd, pfde, &cookie[i]);
773 ok(hr == S_OK, "got 0x%08x\n", hr);
774 ok(cookie[i] == i+1, "Got cookie: %d\n", cookie[i]);
776 ok(pfdeimpl->ref == 10+1, "got ref %d\n", pfdeimpl->ref);
778 for(i = 3; i < 7; i++) {
779 hr = IFileDialog_Unadvise(pfd, cookie[i]);
780 ok(hr == S_OK, "got 0x%08x\n", hr);
782 ok(pfdeimpl->ref == 6+1, "got ref %d\n", pfdeimpl->ref);
784 for(i = 0; i < 3; i++) {
785 hr = IFileDialog_Unadvise(pfd, cookie[i]);
786 ok(hr == S_OK, "got 0x%08x\n", hr);
788 ok(pfdeimpl->ref == 3+1, "got ref %d\n", pfdeimpl->ref);
790 for(i = 7; i < 10; i++) {
791 hr = IFileDialog_Unadvise(pfd, cookie[i]);
792 ok(hr == S_OK, "got 0x%08x\n", hr);
794 ok(pfdeimpl->ref == 1, "got ref %d\n", pfdeimpl->ref);
796 hr = IFileDialog_Unadvise(pfd, cookie[9]+1);
797 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
798 ok(pfdeimpl->ref == 1, "got ref %d\n", pfdeimpl->ref);
800 hr = IFileDialog_Advise(pfd, pfde, &cookie[0]);
801 ok(hr == S_OK, "got 0x%08x\n", hr);
802 todo_wine ok(cookie[0] == 1, "got cookie: %d\n", cookie[0]);
803 ok(pfdeimpl->ref == 1+1, "got ref %d\n", pfdeimpl->ref);
805 hr = IFileDialog_Unadvise(pfd, cookie[0]);
809 /* Unadvising already unadvised cookies crashes on
811 IFileDialog_Unadvise(pfd, cookie[0]);
815 IFileDialogEvents_Release(pfde);
818 static void test_advise(void)
823 trace("Testing FileOpenDialog (advise)\n");
824 hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
825 &IID_IFileDialog, (void**)&pfd);
826 ok(hr == S_OK, "got 0x%08x.\n", hr);
827 test_advise_helper(pfd);
828 IFileDialog_Release(pfd);
830 trace("Testing FileSaveDialog (advise)\n");
831 hr = CoCreateInstance(&CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER,
832 &IID_IFileDialog, (void**)&pfd);
833 ok(hr == S_OK, "got 0x%08x.\n", hr);
834 test_advise_helper(pfd);
835 IFileDialog_Release(pfd);
841 init_function_pointers();
843 if(test_instantiation())
849 skip("Skipping all Item Dialog tests.\n");