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 #define IDT_CHANGEFILETYPE 500
29 #define IDT_CLOSEDIALOG 501
32 IFDEVENT_TEST_NONE
= 0,
36 } FileDialogEventsTest
;
38 static HRESULT (WINAPI
*pSHCreateShellItem
)(LPCITEMIDLIST
,IShellFolder
*,LPCITEMIDLIST
,IShellItem
**);
39 static HRESULT (WINAPI
*pSHGetIDListFromObject
)(IUnknown
*, PIDLIST_ABSOLUTE
*);
40 static HRESULT (WINAPI
*pSHCreateItemFromParsingName
)(PCWSTR
,IBindCtx
*,REFIID
,void**);
42 static void init_function_pointers(void)
44 HMODULE hmod
= GetModuleHandleA("shell32.dll");
46 #define MAKEFUNC(f) (p##f = (void*)GetProcAddress(hmod, #f))
47 MAKEFUNC(SHCreateShellItem
);
48 MAKEFUNC(SHGetIDListFromObject
);
49 MAKEFUNC(SHCreateItemFromParsingName
);
54 DEFINE_GUID(IID_IFileDialogCustomizeAlt
, 0x8016B7B3, 0x3D49, 0x4504, 0xA0,0xAA, 0x2A,0x37,0x49,0x4E,0x60,0x6F);
61 static BOOL CALLBACK
find_window_callback(HWND hwnd
, LPARAM lparam
)
63 struct fw_arg
*arg
= (struct fw_arg
*)lparam
;
68 GetClassNameW(hwnd
, buf
, 1024);
69 if(lstrcmpW(buf
, arg
->class))
75 GetWindowTextW(hwnd
, buf
, 1024);
76 if(lstrcmpW(buf
, arg
->text
))
84 static HWND
find_window(HWND parent
, LPCWSTR
class, LPCWSTR text
)
86 struct fw_arg arg
= {class, text
, NULL
};
88 EnumChildWindows(parent
, find_window_callback
, (LPARAM
)&arg
);
92 static HWND
get_hwnd_from_ifiledialog(IFileDialog
*pfd
)
98 hr
= IFileDialog_QueryInterface(pfd
, &IID_IOleWindow
, (void**)&pow
);
99 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
101 hr
= IOleWindow_GetWindow(pow
, &dlg_hwnd
);
102 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
104 IOleWindow_Release(pow
);
109 static void test_customize_onfolderchange(IFileDialog
*pfd
);
110 static void filedialog_change_filetype(IFileDialog
*pfd
, HWND dlg_hwnd
);
112 /**************************************************************************
113 * IFileDialogEvents implementation
116 IFileDialogEvents IFileDialogEvents_iface
;
119 LONG OnFileOk
, OnFolderChanging
, OnFolderChange
;
120 LONG OnSelectionChange
, OnShareViolation
, OnTypeChange
;
122 LPCWSTR set_filename
;
123 BOOL set_filename_tried
;
124 FileDialogEventsTest events_test
;
125 } IFileDialogEventsImpl
;
127 static inline IFileDialogEventsImpl
*impl_from_IFileDialogEvents(IFileDialogEvents
*iface
)
129 return CONTAINING_RECORD(iface
, IFileDialogEventsImpl
, IFileDialogEvents_iface
);
132 static HRESULT WINAPI
IFileDialogEvents_fnQueryInterface(IFileDialogEvents
*iface
, REFIID riid
, void **ppv
)
135 ok(0, "Unexpectedly called.\n");
136 return E_NOINTERFACE
;
139 static ULONG WINAPI
IFileDialogEvents_fnAddRef(IFileDialogEvents
*iface
)
141 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
142 return InterlockedIncrement(&This
->ref
);
145 static ULONG WINAPI
IFileDialogEvents_fnRelease(IFileDialogEvents
*iface
)
147 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
148 LONG ref
= InterlockedDecrement(&This
->ref
);
151 HeapFree(GetProcessHeap(), 0, This
);
156 static HRESULT WINAPI
IFileDialogEvents_fnOnFileOk(IFileDialogEvents
*iface
, IFileDialog
*pfd
)
158 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
163 static HRESULT WINAPI
IFileDialogEvents_fnOnFolderChanging(IFileDialogEvents
*iface
,
165 IShellItem
*psiFolder
)
167 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
168 This
->OnFolderChanging
++;
172 static LRESULT CALLBACK
test_customize_dlgproc(HWND hwnd
, UINT message
, WPARAM wparam
, LPARAM lparam
)
174 WNDPROC oldwndproc
= GetPropA(hwnd
, "WT_OLDWC");
175 IFileDialog
*pfd
= GetPropA(hwnd
, "WT_PFD");
181 test_customize_onfolderchange(pfd
);
186 case IDT_CHANGEFILETYPE
:
187 filedialog_change_filetype(pfd
, hwnd
);
188 KillTimer(hwnd
, IDT_CHANGEFILETYPE
);
189 SetTimer(hwnd
, IDT_CLOSEDIALOG
, 100, 0);
191 case IDT_CLOSEDIALOG
:
192 /* Calling IFileDialog_Close here does not work */
193 br
= PostMessageW(hwnd
, WM_COMMAND
, IDCANCEL
, 0);
199 return CallWindowProcW(oldwndproc
, hwnd
, message
, wparam
, lparam
);
202 static HRESULT WINAPI
IFileDialogEvents_fnOnFolderChange(IFileDialogEvents
*iface
, IFileDialog
*pfd
)
204 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
208 This
->OnFolderChange
++;
210 if(This
->set_filename
)
212 dlg_hwnd
= get_hwnd_from_ifiledialog(pfd
);
213 ok(dlg_hwnd
!= NULL
, "Got NULL.\n");
215 hr
= IFileDialog_SetFileName(pfd
, This
->set_filename
);
216 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
218 if(!This
->set_filename_tried
)
220 br
= PostMessageW(dlg_hwnd
, WM_COMMAND
, IDOK
, 0);
222 This
->set_filename_tried
= TRUE
;
226 if(This
->events_test
)
230 dlg_hwnd
= get_hwnd_from_ifiledialog(pfd
);
232 /* On Vista, the custom control area of the dialog is not
233 * fully set up when the first OnFolderChange event is
235 oldwndproc
= (WNDPROC
)GetWindowLongPtrW(dlg_hwnd
, GWLP_WNDPROC
);
236 SetPropA(dlg_hwnd
, "WT_OLDWC", (HANDLE
)oldwndproc
);
237 SetPropA(dlg_hwnd
, "WT_PFD", (HANDLE
)pfd
);
238 SetWindowLongPtrW(dlg_hwnd
, GWLP_WNDPROC
, (LPARAM
)test_customize_dlgproc
);
240 switch(This
->events_test
)
243 br
= PostMessageW(dlg_hwnd
, WM_USER
+0x1234, 0, 0);
247 SetTimer(dlg_hwnd
, IDT_CLOSEDIALOG
, 100, 0);
250 SetTimer(dlg_hwnd
, IDT_CHANGEFILETYPE
, 100, 0);
253 ok(FALSE
, "Should not happen (%d)\n", This
->events_test
);
260 static HRESULT WINAPI
IFileDialogEvents_fnOnSelectionChange(IFileDialogEvents
*iface
, IFileDialog
*pfd
)
262 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
263 This
->OnSelectionChange
++;
267 static HRESULT WINAPI
IFileDialogEvents_fnOnShareViolation(IFileDialogEvents
*iface
,
270 FDE_SHAREVIOLATION_RESPONSE
*pResponse
)
272 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
273 This
->OnShareViolation
++;
277 static HRESULT WINAPI
IFileDialogEvents_fnOnTypeChange(IFileDialogEvents
*iface
, IFileDialog
*pfd
)
279 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
280 This
->OnTypeChange
++;
284 static HRESULT WINAPI
IFileDialogEvents_fnOnOverwrite(IFileDialogEvents
*iface
,
287 FDE_OVERWRITE_RESPONSE
*pResponse
)
289 IFileDialogEventsImpl
*This
= impl_from_IFileDialogEvents(iface
);
291 ok(*pResponse
== FDEOR_DEFAULT
, "overwrite response %u\n", *pResponse
);
292 *pResponse
= FDEOR_ACCEPT
;
293 ok(!This
->OnFileOk
, "OnFileOk already called %u times\n", This
->OnFileOk
);
297 static const IFileDialogEventsVtbl vt_IFileDialogEvents
= {
298 IFileDialogEvents_fnQueryInterface
,
299 IFileDialogEvents_fnAddRef
,
300 IFileDialogEvents_fnRelease
,
301 IFileDialogEvents_fnOnFileOk
,
302 IFileDialogEvents_fnOnFolderChanging
,
303 IFileDialogEvents_fnOnFolderChange
,
304 IFileDialogEvents_fnOnSelectionChange
,
305 IFileDialogEvents_fnOnShareViolation
,
306 IFileDialogEvents_fnOnTypeChange
,
307 IFileDialogEvents_fnOnOverwrite
310 static IFileDialogEvents
*IFileDialogEvents_Constructor(void)
312 IFileDialogEventsImpl
*This
;
314 This
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IFileDialogEventsImpl
));
315 This
->IFileDialogEvents_iface
.lpVtbl
= &vt_IFileDialogEvents
;
318 return &This
->IFileDialogEvents_iface
;
321 static BOOL
test_instantiation(void)
324 IFileOpenDialog
*pfod
;
325 IFileSaveDialog
*pfsd
;
326 IServiceProvider
*psp
;
328 IUnknown
*punk
, *unk2
;
332 /* Instantiate FileOpenDialog */
333 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
334 &IID_IFileOpenDialog
, (void**)&pfod
);
337 win_skip("Could not instantiate the FileOpenDialog.\n");
340 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
342 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IFileDialog
, (void**)&pfd
);
343 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
344 if(SUCCEEDED(hr
)) IFileDialog_Release(pfd
);
346 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IFileDialogCustomize
, (void**)&punk
);
347 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
349 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IFileDialogCustomizeAlt
, (void**)&unk2
);
350 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
351 ok(punk
== unk2
, "got %p, %p\n", punk
, unk2
);
352 IUnknown_Release(punk
);
353 IUnknown_Release(unk2
);
355 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IFileSaveDialog
, (void**)&pfsd
);
356 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
357 if(SUCCEEDED(hr
)) IFileSaveDialog_Release(pfsd
);
359 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IServiceProvider
, (void**)&psp
);
360 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
363 IExplorerBrowser
*peb
;
366 hr
= IServiceProvider_QueryService(psp
, &SID_SExplorerBrowserFrame
, &IID_ICommDlgBrowser
, (void**)&punk
);
367 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
368 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
370 /* since win8, the result is E_NOTIMPL for all other services */
371 hr
= IServiceProvider_QueryService(psp
, &SID_STopLevelBrowser
, &IID_IExplorerBrowser
, (void**)&peb
);
372 ok(hr
== E_NOTIMPL
|| broken(hr
== E_FAIL
), "got 0x%08x (expected E_NOTIMPL)\n", hr
);
373 if(SUCCEEDED(hr
)) IExplorerBrowser_Release(peb
);
374 hr
= IServiceProvider_QueryService(psp
, &SID_STopLevelBrowser
, &IID_IShellBrowser
, (void**)&psb
);
375 ok(hr
== E_NOTIMPL
|| broken(hr
== E_FAIL
), "got 0x%08x (expected E_NOTIMPL)\n", hr
);
376 if(SUCCEEDED(hr
)) IShellBrowser_Release(psb
);
377 hr
= IServiceProvider_QueryService(psp
, &SID_STopLevelBrowser
, &IID_ICommDlgBrowser
, (void**)&punk
);
378 ok(hr
== E_NOTIMPL
|| broken(hr
== E_FAIL
), "got 0x%08x (expected E_NOTIMPL)\n", hr
);
379 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
381 hr
= IServiceProvider_QueryService(psp
, &SID_STopLevelBrowser
, &IID_IUnknown
, (void**)&punk
);
382 ok(hr
== E_NOTIMPL
|| broken(hr
== E_FAIL
), "got 0x%08x (expected E_NOTIMPL)\n", hr
);
383 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
384 hr
= IServiceProvider_QueryService(psp
, &IID_IUnknown
, &IID_IUnknown
, (void**)&punk
);
385 ok(hr
== E_NOTIMPL
|| broken(hr
== E_FAIL
), "got 0x%08x (expected E_NOTIMPL)\n", hr
);
386 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
388 IServiceProvider_Release(psp
);
391 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IFileDialogEvents
, (void**)&punk
);
392 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
393 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
395 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IExplorerBrowser
, (void**)&punk
);
396 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
397 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
399 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IExplorerBrowserEvents
, (void**)&punk
);
400 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
401 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
403 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_ICommDlgBrowser3
, (void**)&punk
);
404 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
405 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
407 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IShellBrowser
, (void**)&punk
);
408 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
409 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
411 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IOleWindow
, (void**)&pow
);
412 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
417 hr
= IOleWindow_ContextSensitiveHelp(pow
, TRUE
);
418 todo_wine
ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
420 hr
= IOleWindow_ContextSensitiveHelp(pow
, FALSE
);
421 todo_wine
ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
425 /* Crashes on win7 */
426 IOleWindow_GetWindow(pow
, NULL
);
429 hr
= IOleWindow_GetWindow(pow
, &hwnd
);
430 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
431 ok(hwnd
== NULL
, "Got %p\n", hwnd
);
433 IOleWindow_Release(pow
);
436 ref
= IFileOpenDialog_Release(pfod
);
437 ok(!ref
, "Got refcount %d, should have been released.\n", ref
);
439 /* Instantiate FileSaveDialog */
440 hr
= CoCreateInstance(&CLSID_FileSaveDialog
, NULL
, CLSCTX_INPROC_SERVER
,
441 &IID_IFileSaveDialog
, (void**)&pfsd
);
444 skip("Could not instantiate the FileSaveDialog.\n");
447 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
449 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IFileDialog
, (void**)&pfd
);
450 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
451 if(SUCCEEDED(hr
)) IFileDialog_Release(pfd
);
453 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IFileDialogCustomize
, (void**)&punk
);
454 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
456 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IFileDialogCustomizeAlt
, (void**)&unk2
);
457 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
458 ok(punk
== unk2
, "got %p, %p\n", punk
, unk2
);
459 IUnknown_Release(punk
);
460 IUnknown_Release(unk2
);
462 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IFileOpenDialog
, (void**)&pfod
);
463 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
464 if(SUCCEEDED(hr
)) IFileOpenDialog_Release(pfod
);
466 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IFileDialogEvents
, (void**)&punk
);
467 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
468 if(SUCCEEDED(hr
)) IFileDialog_Release(pfd
);
470 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IExplorerBrowser
, (void**)&punk
);
471 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
472 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
474 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IExplorerBrowserEvents
, (void**)&punk
);
475 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
476 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
478 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_ICommDlgBrowser3
, (void**)&punk
);
479 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
480 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
482 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IShellBrowser
, (void**)&punk
);
483 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
484 if(SUCCEEDED(hr
)) IUnknown_Release(punk
);
486 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IOleWindow
, (void**)&pow
);
487 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
492 hr
= IOleWindow_ContextSensitiveHelp(pow
, TRUE
);
493 todo_wine
ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
495 hr
= IOleWindow_ContextSensitiveHelp(pow
, FALSE
);
496 todo_wine
ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
500 /* Crashes on win7 */
501 IOleWindow_GetWindow(pow
, NULL
);
504 hr
= IOleWindow_GetWindow(pow
, &hwnd
);
505 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
506 ok(hwnd
== NULL
, "Got %p\n", hwnd
);
508 IOleWindow_Release(pow
);
512 ref
= IFileSaveDialog_Release(pfsd
);
513 ok(!ref
, "Got refcount %d, should have been released.\n", ref
);
517 static void test_basics(void)
519 IFileOpenDialog
*pfod
;
520 IFileSaveDialog
*pfsd
;
522 FILEOPENDIALOGOPTIONS fdoptions
;
523 IShellFolder
*psfdesktop
;
524 IShellItem
*psi
, *psidesktop
, *psi_original
;
525 IShellItemArray
*psia
;
532 const WCHAR txt
[] = {'t','x','t', 0};
533 const WCHAR null
[] = {0};
534 const WCHAR fname1
[] = {'f','n','a','m','e','1', 0};
535 const WCHAR fspec1
[] = {'*','.','t','x','t',0};
536 const WCHAR fname2
[] = {'f','n','a','m','e','2', 0};
537 const WCHAR fspec2
[] = {'*','.','e','x','e',0};
538 COMDLG_FILTERSPEC filterspec
[2] = {{fname1
, fspec1
}, {fname2
, fspec2
}};
540 /* This should work on every platform with IFileDialog */
541 SHGetDesktopFolder(&psfdesktop
);
542 hr
= pSHGetIDListFromObject((IUnknown
*)psfdesktop
, &pidl
);
545 hr
= pSHCreateShellItem(NULL
, NULL
, pidl
, &psidesktop
);
548 IShellFolder_Release(psfdesktop
);
551 skip("Failed to get ShellItem from DesktopFolder, skipping tests.\n");
556 /* Instantiate FileOpenDialog and FileSaveDialog */
557 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
558 &IID_IFileOpenDialog
, (void**)&pfod
);
559 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
560 hr
= CoCreateInstance(&CLSID_FileSaveDialog
, NULL
, CLSCTX_INPROC_SERVER
,
561 &IID_IFileSaveDialog
, (void**)&pfsd
);
562 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
564 /* ClearClientData */
567 hr
= IFileOpenDialog_ClearClientData(pfod
);
568 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
569 hr
= IFileSaveDialog_ClearClientData(pfsd
);
570 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
574 hr
= IFileOpenDialog_GetOptions(pfod
, NULL
);
575 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
576 hr
= IFileSaveDialog_GetOptions(pfsd
, NULL
);
577 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
579 /* Check default options */
580 hr
= IFileOpenDialog_GetOptions(pfod
, &fdoptions
);
581 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
582 ok(fdoptions
== (FOS_PATHMUSTEXIST
| FOS_FILEMUSTEXIST
| FOS_NOCHANGEDIR
),
583 "Unexpected default options: 0x%08x\n", fdoptions
);
584 hr
= IFileSaveDialog_GetOptions(pfsd
, &fdoptions
);
585 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
586 ok(fdoptions
== (FOS_OVERWRITEPROMPT
| FOS_NOREADONLYRETURN
| FOS_PATHMUSTEXIST
| FOS_NOCHANGEDIR
),
587 "Unexpected default options: 0x%08x\n", fdoptions
);
590 hr
= IFileOpenDialog_GetResult(pfod
, NULL
);
591 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
592 hr
= IFileSaveDialog_GetResult(pfsd
, NULL
);
593 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
595 psi
= (void*)0xdeadbeef;
596 hr
= IFileOpenDialog_GetResult(pfod
, &psi
);
597 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
598 ok(psi
== (void*)0xdeadbeef, "got %p.\n", psi
);
599 psi
= (void*)0xdeadbeef;
600 hr
= IFileSaveDialog_GetResult(pfsd
, &psi
);
601 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
602 ok(psi
== (void*)0xdeadbeef, "got %p.\n", psi
);
604 /* GetCurrentSelection */
606 /* Crashes on Vista/W2K8. Tests below passes on Windows 7 */
607 hr
= IFileOpenDialog_GetCurrentSelection(pfod
, NULL
);
608 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
609 hr
= IFileSaveDialog_GetCurrentSelection(pfsd
, NULL
);
610 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
611 hr
= IFileOpenDialog_GetCurrentSelection(pfod
, &psi
);
612 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
613 hr
= IFileSaveDialog_GetCurrentSelection(pfsd
, &psi
);
614 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
618 hr
= IFileOpenDialog_GetFileName(pfod
, NULL
);
619 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
620 filename
= (void*)0xdeadbeef;
621 hr
= IFileOpenDialog_GetFileName(pfod
, &filename
);
622 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
623 ok(filename
== NULL
, "got %p\n", filename
);
624 hr
= IFileSaveDialog_GetFileName(pfsd
, NULL
);
625 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
626 filename
= (void*)0xdeadbeef;
627 hr
= IFileSaveDialog_GetFileName(pfsd
, &filename
);
628 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
629 ok(filename
== NULL
, "got %p\n", filename
);
631 /* GetFileTypeIndex */
632 hr
= IFileOpenDialog_GetFileTypeIndex(pfod
, NULL
);
633 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
635 hr
= IFileOpenDialog_GetFileTypeIndex(pfod
, &filetype
);
636 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
637 ok(filetype
== 0, "got %d.\n", filetype
);
638 hr
= IFileSaveDialog_GetFileTypeIndex(pfsd
, NULL
);
639 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
641 hr
= IFileSaveDialog_GetFileTypeIndex(pfsd
, &filetype
);
642 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
643 ok(filetype
== 0, "got %d.\n", filetype
);
645 /* SetFileTypes / SetFileTypeIndex */
646 hr
= IFileOpenDialog_SetFileTypes(pfod
, 0, NULL
);
647 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
648 hr
= IFileOpenDialog_SetFileTypes(pfod
, 0, filterspec
);
649 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
651 hr
= IFileOpenDialog_SetFileTypeIndex(pfod
, 0);
652 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
653 hr
= IFileOpenDialog_SetFileTypeIndex(pfod
, 1);
654 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
655 hr
= IFileOpenDialog_SetFileTypes(pfod
, 1, filterspec
);
656 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
657 hr
= IFileOpenDialog_SetFileTypes(pfod
, 0, filterspec
);
658 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
659 hr
= IFileOpenDialog_SetFileTypeIndex(pfod
, 0);
660 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
661 hr
= IFileOpenDialog_GetFileTypeIndex(pfod
, &filetype
);
662 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
663 ok(filetype
== 1, "got %d\n", filetype
);
664 hr
= IFileOpenDialog_SetFileTypeIndex(pfod
, 100);
665 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
666 hr
= IFileOpenDialog_GetFileTypeIndex(pfod
, &filetype
);
667 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
668 ok(filetype
== 1, "got %d\n", filetype
);
669 hr
= IFileOpenDialog_SetFileTypes(pfod
, 1, filterspec
);
670 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
671 hr
= IFileOpenDialog_SetFileTypes(pfod
, 1, &filterspec
[1]);
672 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
674 hr
= IFileSaveDialog_SetFileTypeIndex(pfsd
, 0);
675 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
676 hr
= IFileSaveDialog_SetFileTypeIndex(pfsd
, 1);
677 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
678 hr
= IFileSaveDialog_SetFileTypes(pfsd
, 2, filterspec
);
679 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
680 hr
= IFileSaveDialog_GetFileTypeIndex(pfsd
, &filetype
);
681 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
682 /* I hope no one relies on this one */
683 todo_wine
ok(filetype
== 0, "got %d\n", filetype
);
684 hr
= IFileSaveDialog_SetFileTypeIndex(pfsd
, 0);
685 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
686 hr
= IFileSaveDialog_GetFileTypeIndex(pfsd
, &filetype
);
687 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
688 ok(filetype
== 1, "got %d\n", filetype
);
689 hr
= IFileSaveDialog_SetFileTypeIndex(pfsd
, 100);
690 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
691 hr
= IFileSaveDialog_GetFileTypeIndex(pfsd
, &filetype
);
692 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
693 ok(filetype
== 2, "got %d\n", filetype
);
694 hr
= IFileSaveDialog_SetFileTypes(pfsd
, 1, filterspec
);
695 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
696 hr
= IFileSaveDialog_SetFileTypes(pfsd
, 1, &filterspec
[1]);
697 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
702 hr
= IFileOpenDialog_SetFilter(pfod
, NULL
);
703 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
704 hr
= IFileSaveDialog_SetFilter(pfsd
, NULL
);
705 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
709 hr
= IFileOpenDialog_SetFolder(pfod
, NULL
);
710 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
711 hr
= IFileSaveDialog_SetFolder(pfsd
, NULL
);
712 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
714 /* SetDefaultExtension */
715 hr
= IFileOpenDialog_SetDefaultExtension(pfod
, NULL
);
716 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
717 hr
= IFileOpenDialog_SetDefaultExtension(pfod
, txt
);
718 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
719 hr
= IFileOpenDialog_SetDefaultExtension(pfod
, null
);
720 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
722 hr
= IFileSaveDialog_SetDefaultExtension(pfsd
, NULL
);
723 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
724 hr
= IFileSaveDialog_SetDefaultExtension(pfsd
, txt
);
725 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
726 hr
= IFileSaveDialog_SetDefaultExtension(pfsd
, null
);
727 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
729 /* SetDefaultFolder */
730 hr
= IFileOpenDialog_SetDefaultFolder(pfod
, NULL
);
731 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
732 hr
= IFileSaveDialog_SetDefaultFolder(pfsd
, NULL
);
733 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
735 hr
= IFileOpenDialog_SetDefaultFolder(pfod
, psidesktop
);
736 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
737 hr
= IFileSaveDialog_SetDefaultFolder(pfsd
, psidesktop
);
738 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
742 /* Crashes under Windows 7 */
743 IFileOpenDialog_SetDefaultFolder(pfod
, (void*)0x1234);
744 IFileSaveDialog_SetDefaultFolder(pfsd
, (void*)0x1234);
747 /* GetFolder / SetFolder */
748 hr
= IFileOpenDialog_GetFolder(pfod
, NULL
);
749 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
751 hr
= IFileOpenDialog_GetFolder(pfod
, &psi_original
);
752 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
755 hr
= IFileOpenDialog_SetFolder(pfod
, psidesktop
);
756 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
757 hr
= IFileOpenDialog_SetFolder(pfod
, psi_original
);
758 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
759 IShellItem_Release(psi_original
);
762 hr
= IFileSaveDialog_GetFolder(pfsd
, &psi_original
);
763 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
766 hr
= IFileSaveDialog_SetFolder(pfsd
, psidesktop
);
767 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
768 hr
= IFileSaveDialog_SetFolder(pfsd
, psi_original
);
769 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
770 IShellItem_Release(psi_original
);
776 /* Crashes under Windows 7 */
777 IFileOpenDialog_AddPlace(pfod
, NULL
, 0);
778 IFileSaveDialog_AddPlace(pfsd
, NULL
, 0);
783 hr
= IFileOpenDialog_AddPlace(pfod
, psidesktop
, FDAP_TOP
+ 1);
784 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
785 hr
= IFileOpenDialog_AddPlace(pfod
, psidesktop
, FDAP_BOTTOM
);
786 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
787 hr
= IFileOpenDialog_AddPlace(pfod
, psidesktop
, FDAP_TOP
);
788 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
790 hr
= IFileSaveDialog_AddPlace(pfsd
, psidesktop
, FDAP_TOP
+ 1);
791 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
792 hr
= IFileSaveDialog_AddPlace(pfsd
, psidesktop
, FDAP_BOTTOM
);
793 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
794 hr
= IFileSaveDialog_AddPlace(pfsd
, psidesktop
, FDAP_TOP
);
795 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
799 hr
= IFileOpenDialog_SetFileName(pfod
, NULL
);
800 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
801 hr
= IFileOpenDialog_SetFileName(pfod
, null
);
802 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
803 hr
= IFileOpenDialog_SetFileName(pfod
, txt
);
804 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
805 hr
= IFileOpenDialog_GetFileName(pfod
, &filename
);
806 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
807 ok(!lstrcmpW(filename
, txt
), "Strings do not match.\n");
808 CoTaskMemFree(filename
);
810 hr
= IFileSaveDialog_SetFileName(pfsd
, NULL
);
811 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
812 hr
= IFileSaveDialog_SetFileName(pfsd
, null
);
813 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
814 hr
= IFileSaveDialog_SetFileName(pfsd
, txt
);
815 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
816 hr
= IFileSaveDialog_GetFileName(pfsd
, &filename
);
817 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
818 ok(!lstrcmpW(filename
, txt
), "Strings do not match.\n");
819 CoTaskMemFree(filename
);
821 /* SetFileNameLabel */
822 hr
= IFileOpenDialog_SetFileNameLabel(pfod
, NULL
);
823 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
824 hr
= IFileOpenDialog_SetFileNameLabel(pfod
, null
);
825 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
826 hr
= IFileOpenDialog_SetFileNameLabel(pfod
, txt
);
827 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
829 hr
= IFileSaveDialog_SetFileNameLabel(pfsd
, NULL
);
830 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
831 hr
= IFileSaveDialog_SetFileNameLabel(pfsd
, null
);
832 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
833 hr
= IFileSaveDialog_SetFileNameLabel(pfsd
, txt
);
834 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
837 hr
= IFileOpenDialog_Close(pfod
, S_FALSE
);
838 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
839 hr
= IFileSaveDialog_Close(pfsd
, S_FALSE
);
840 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
842 /* SetOkButtonLabel */
843 hr
= IFileOpenDialog_SetOkButtonLabel(pfod
, NULL
);
844 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
845 hr
= IFileOpenDialog_SetOkButtonLabel(pfod
, null
);
846 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
847 hr
= IFileOpenDialog_SetOkButtonLabel(pfod
, txt
);
848 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
849 hr
= IFileSaveDialog_SetOkButtonLabel(pfsd
, NULL
);
850 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
851 hr
= IFileSaveDialog_SetOkButtonLabel(pfsd
, null
);
852 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
853 hr
= IFileSaveDialog_SetOkButtonLabel(pfsd
, txt
);
854 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
857 hr
= IFileOpenDialog_SetTitle(pfod
, NULL
);
858 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
859 hr
= IFileOpenDialog_SetTitle(pfod
, null
);
860 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
861 hr
= IFileOpenDialog_SetTitle(pfod
, txt
);
862 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
863 hr
= IFileSaveDialog_SetTitle(pfsd
, NULL
);
864 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
865 hr
= IFileSaveDialog_SetTitle(pfsd
, null
);
866 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
867 hr
= IFileSaveDialog_SetTitle(pfsd
, txt
);
868 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
870 /** IFileOpenDialog specific **/
875 /* Crashes under Windows 7 */
876 IFileOpenDialog_GetResults(pfod
, NULL
);
878 psia
= (void*)0xdeadbeef;
879 hr
= IFileOpenDialog_GetResults(pfod
, &psia
);
880 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
881 ok(psia
== NULL
, "got %p.\n", psia
);
883 /* GetSelectedItems */
886 /* Crashes under W2K8 */
887 hr
= IFileOpenDialog_GetSelectedItems(pfod
, NULL
);
888 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
889 psia
= (void*)0xdeadbeef;
890 hr
= IFileOpenDialog_GetSelectedItems(pfod
, &psia
);
891 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
892 ok(psia
== (void*)0xdeadbeef, "got %p.\n", psia
);
895 /** IFileSaveDialog specific **/
897 /* ApplyProperties */
900 /* Crashes under windows 7 */
901 IFileSaveDialog_ApplyProperties(pfsd
, NULL
, NULL
, NULL
, NULL
);
902 IFileSaveDialog_ApplyProperties(pfsd
, psidesktop
, NULL
, NULL
, NULL
);
906 hr
= IFileSaveDialog_GetProperties(pfsd
, NULL
);
907 todo_wine
ok(hr
== E_UNEXPECTED
, "got 0x%08x\n", hr
);
908 pps
= (void*)0xdeadbeef;
909 hr
= IFileSaveDialog_GetProperties(pfsd
, &pps
);
910 todo_wine
ok(hr
== E_UNEXPECTED
, "got 0x%08x\n", hr
);
911 ok(pps
== (void*)0xdeadbeef, "got %p\n", pps
);
916 /* Crashes under W2K8 */
917 hr
= IFileSaveDialog_SetProperties(pfsd
, NULL
);
918 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
921 /* SetCollectedProperties */
924 hr
= IFileSaveDialog_SetCollectedProperties(pfsd
, NULL
, TRUE
);
925 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
926 hr
= IFileSaveDialog_SetCollectedProperties(pfsd
, NULL
, FALSE
);
927 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
933 hr
= IFileSaveDialog_SetSaveAsItem(pfsd
, NULL
);
934 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
935 hr
= IFileSaveDialog_SetSaveAsItem(pfsd
, psidesktop
);
936 ok(hr
== MK_E_NOOBJECT
, "got 0x%08x\n", hr
);
941 hr
= IFileOpenDialog_QueryInterface(pfod
, &IID_IFileDialog2
, (void**)&pfd2
);
942 ok((hr
== S_OK
) || broken(hr
== E_NOINTERFACE
), "got 0x%08x\n", hr
);
945 /* SetCancelButtonLabel */
946 hr
= IFileDialog2_SetOkButtonLabel(pfd2
, NULL
);
947 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
948 hr
= IFileDialog2_SetOkButtonLabel(pfd2
, null
);
949 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
950 hr
= IFileDialog2_SetOkButtonLabel(pfd2
, txt
);
951 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
953 /* SetNavigationRoot */
956 hr
= IFileDialog2_SetNavigationRoot(pfd2
, NULL
);
957 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
958 hr
= IFileDialog2_SetNavigationRoot(pfd2
, psidesktop
);
959 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
962 IFileDialog2_Release(pfd2
);
965 hr
= IFileSaveDialog_QueryInterface(pfsd
, &IID_IFileDialog2
, (void**)&pfd2
);
966 ok((hr
== S_OK
) || broken(hr
== E_NOINTERFACE
), "got 0x%08x\n", hr
);
969 /* SetCancelButtonLabel */
970 hr
= IFileDialog2_SetOkButtonLabel(pfd2
, NULL
);
971 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
972 hr
= IFileDialog2_SetOkButtonLabel(pfd2
, null
);
973 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
974 hr
= IFileDialog2_SetOkButtonLabel(pfd2
, txt
);
975 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
977 /* SetNavigationRoot */
980 hr
= IFileDialog2_SetNavigationRoot(pfd2
, NULL
);
981 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
982 hr
= IFileDialog2_SetNavigationRoot(pfd2
, psidesktop
);
983 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
986 IFileDialog2_Release(pfd2
);
990 IShellItem_Release(psidesktop
);
991 ref
= IFileOpenDialog_Release(pfod
);
992 ok(!ref
, "Got refcount %d, should have been released.\n", ref
);
993 ref
= IFileSaveDialog_Release(pfsd
);
994 ok(!ref
, "Got refcount %d, should have been released.\n", ref
);
997 static void ensure_zero_events_(const char *file
, int line
, IFileDialogEventsImpl
*impl
)
999 ok_(file
, line
)(!impl
->OnFileOk
, "OnFileOk: %d\n", impl
->OnFileOk
);
1000 ok_(file
, line
)(!impl
->OnFolderChanging
, "OnFolderChanging: %d\n", impl
->OnFolderChanging
);
1001 ok_(file
, line
)(!impl
->OnFolderChange
, "OnFolderChange: %d\n", impl
->OnFolderChange
);
1002 ok_(file
, line
)(!impl
->OnSelectionChange
, "OnSelectionChange: %d\n", impl
->OnSelectionChange
);
1003 ok_(file
, line
)(!impl
->OnShareViolation
, "OnShareViolation: %d\n", impl
->OnShareViolation
);
1004 ok_(file
, line
)(!impl
->OnTypeChange
, "OnTypeChange: %d\n", impl
->OnTypeChange
);
1005 ok_(file
, line
)(!impl
->OnOverwrite
, "OnOverwrite: %d\n", impl
->OnOverwrite
);
1006 impl
->OnFileOk
= impl
->OnFolderChanging
= impl
->OnFolderChange
= 0;
1007 impl
->OnSelectionChange
= impl
->OnShareViolation
= impl
->OnTypeChange
= 0;
1008 impl
->OnOverwrite
= 0;
1010 #define ensure_zero_events(impl) ensure_zero_events_(__FILE__, __LINE__, impl)
1012 static void test_advise_helper(IFileDialog
*pfd
)
1014 IFileDialogEventsImpl
*pfdeimpl
;
1015 IFileDialogEvents
*pfde
;
1020 pfde
= IFileDialogEvents_Constructor();
1021 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
1023 hr
= IFileDialog_Advise(pfd
, NULL
, NULL
);
1024 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
1025 hr
= IFileDialog_Advise(pfd
, pfde
, NULL
);
1026 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
1027 hr
= IFileDialog_Advise(pfd
, NULL
, &cookie
[0]);
1028 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
1029 ok(pfdeimpl
->ref
== 1, "got ref %d\n", pfdeimpl
->ref
);
1030 ensure_zero_events(pfdeimpl
);
1032 hr
= IFileDialog_Unadvise(pfd
, 0);
1033 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
1034 for(i
= 0; i
< 10; i
++) {
1035 hr
= IFileDialog_Advise(pfd
, pfde
, &cookie
[i
]);
1036 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
1037 ok(cookie
[i
] == i
+1, "Got cookie: %d\n", cookie
[i
]);
1039 ok(pfdeimpl
->ref
== 10+1, "got ref %d\n", pfdeimpl
->ref
);
1040 ensure_zero_events(pfdeimpl
);
1042 for(i
= 3; i
< 7; i
++) {
1043 hr
= IFileDialog_Unadvise(pfd
, cookie
[i
]);
1044 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
1046 ok(pfdeimpl
->ref
== 6+1, "got ref %d\n", pfdeimpl
->ref
);
1047 ensure_zero_events(pfdeimpl
);
1049 for(i
= 0; i
< 3; i
++) {
1050 hr
= IFileDialog_Unadvise(pfd
, cookie
[i
]);
1051 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
1053 ok(pfdeimpl
->ref
== 3+1, "got ref %d\n", pfdeimpl
->ref
);
1054 ensure_zero_events(pfdeimpl
);
1056 for(i
= 7; i
< 10; i
++) {
1057 hr
= IFileDialog_Unadvise(pfd
, cookie
[i
]);
1058 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
1060 ok(pfdeimpl
->ref
== 1, "got ref %d\n", pfdeimpl
->ref
);
1061 ensure_zero_events(pfdeimpl
);
1063 hr
= IFileDialog_Unadvise(pfd
, cookie
[9]+1);
1064 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
1065 ok(pfdeimpl
->ref
== 1, "got ref %d\n", pfdeimpl
->ref
);
1066 ensure_zero_events(pfdeimpl
);
1068 hr
= IFileDialog_Advise(pfd
, pfde
, &cookie
[0]);
1069 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
1070 todo_wine
ok(cookie
[0] == 1, "got cookie: %d\n", cookie
[0]);
1071 ok(pfdeimpl
->ref
== 1+1, "got ref %d\n", pfdeimpl
->ref
);
1072 ensure_zero_events(pfdeimpl
);
1074 hr
= IFileDialog_Unadvise(pfd
, cookie
[0]);
1078 /* Unadvising already unadvised cookies crashes on
1080 IFileDialog_Unadvise(pfd
, cookie
[0]);
1084 IFileDialogEvents_Release(pfde
);
1087 static void test_advise(void)
1093 trace("Testing FileOpenDialog (advise)\n");
1094 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1095 &IID_IFileDialog
, (void**)&pfd
);
1096 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1097 test_advise_helper(pfd
);
1098 ref
= IFileDialog_Release(pfd
);
1099 ok(!ref
, "Got refcount %d, should have been released.\n", ref
);
1101 trace("Testing FileSaveDialog (advise)\n");
1102 hr
= CoCreateInstance(&CLSID_FileSaveDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1103 &IID_IFileDialog
, (void**)&pfd
);
1104 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1105 test_advise_helper(pfd
);
1106 ref
= IFileDialog_Release(pfd
);
1107 ok(!ref
, "Got refcount %d, should have been released.\n", ref
);
1110 static void filedialog_change_filetype(IFileDialog
*pfd
, HWND dlg_hwnd
)
1113 const WCHAR filetype1
[] = {'f','n','a','m','e','1',0};
1114 const WCHAR filetype1_broken
[] = {'f','n','a','m','e','1',' ', '(','*','.','t','x','t',')',0};
1116 cb_filetype
= find_window(dlg_hwnd
, NULL
, filetype1
);
1117 ok(cb_filetype
!= NULL
|| broken(cb_filetype
== NULL
), "Could not find combobox on first attempt\n");
1121 /* Not sure when this happens. Some specific version?
1122 * Seen on 32-bit English Vista */
1123 trace("Didn't find combobox on first attempt, trying broken string..\n");
1124 cb_filetype
= find_window(dlg_hwnd
, NULL
, filetype1_broken
);
1125 ok(broken(cb_filetype
!= NULL
), "Failed to find combobox on second attempt\n");
1130 /* Making the combobox send a CBN_SELCHANGE */
1131 SendMessageW( cb_filetype
, CB_SHOWDROPDOWN
, 1, 0 );
1132 SendMessageW( cb_filetype
, CB_SETCURSEL
, 1, 0 );
1133 SendMessageW( cb_filetype
, WM_LBUTTONDOWN
, 0, -1 );
1134 SendMessageW( cb_filetype
, WM_LBUTTONUP
, 0, -1 );
1137 static void test_events(void)
1140 IFileDialogEventsImpl
*pfdeimpl
;
1141 IFileDialogEvents
*pfde
;
1145 const WCHAR fname1
[] = {'f','n','a','m','e','1', 0};
1146 const WCHAR fspec1
[] = {'*','.','t','x','t',0};
1147 const WCHAR fname2
[] = {'f','n','a','m','e','2', 0};
1148 const WCHAR fspec2
[] = {'*','.','e','x','e',0};
1149 COMDLG_FILTERSPEC filterspec
[3] = {{fname1
, fspec1
}, {fname2
, fspec2
}};
1153 * 1. Show the dialog with no filetypes added
1155 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1156 &IID_IFileDialog
, (void**)&pfd
);
1157 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1159 pfde
= IFileDialogEvents_Constructor();
1160 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
1161 pfdeimpl
->events_test
= IFDEVENT_TEST2
;
1163 hr
= IFileDialog_Advise(pfd
, pfde
, &cookie
);
1164 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1166 hr
= IFileDialog_Show(pfd
, NULL
);
1167 ok(hr
== HRESULT_FROM_WIN32(ERROR_CANCELLED
), "got 0x%08x.\n", hr
);
1169 ok(pfdeimpl
->OnFolderChanging
== 1, "Got %d\n", pfdeimpl
->OnFolderChanging
);
1170 pfdeimpl
->OnFolderChanging
= 0;
1171 ok(pfdeimpl
->OnFolderChange
== 1, "Got %d\n", pfdeimpl
->OnFolderChange
);
1172 pfdeimpl
->OnFolderChange
= 0;
1173 /* pfdeimpl->OnSelectionChange too unreliable to test. Can be 0, 1 or even 2. */
1174 pfdeimpl
->OnSelectionChange
= 0;
1175 ok(pfdeimpl
->OnTypeChange
== 0, "Got %d\n", pfdeimpl
->OnTypeChange
);
1176 pfdeimpl
->OnTypeChange
= 0;
1178 ensure_zero_events(pfdeimpl
);
1180 hr
= IFileDialog_Unadvise(pfd
, cookie
);
1181 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1183 IFileDialogEvents_Release(pfde
);
1184 ref
= IFileDialog_Release(pfd
);
1185 ok(!ref
|| broken(ref
/* win2008_64 (intermittently) */), "Got %d\n", ref
);
1189 * 2. Show the dialog with filetypes added
1191 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1192 &IID_IFileDialog
, (void**)&pfd
);
1193 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1195 pfde
= IFileDialogEvents_Constructor();
1196 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
1197 pfdeimpl
->events_test
= IFDEVENT_TEST2
;
1199 hr
= IFileDialog_Advise(pfd
, pfde
, &cookie
);
1200 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1202 hr
= IFileDialog_SetFileTypes(pfd
, 2, filterspec
);
1203 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1205 ensure_zero_events(pfdeimpl
);
1207 hr
= IFileDialog_Show(pfd
, NULL
);
1208 ok(hr
== HRESULT_FROM_WIN32(ERROR_CANCELLED
), "got 0x%08x.\n", hr
);
1210 ok(pfdeimpl
->OnFolderChanging
== 1, "Got %d\n", pfdeimpl
->OnFolderChanging
);
1211 pfdeimpl
->OnFolderChanging
= 0;
1212 ok(pfdeimpl
->OnFolderChange
== 1, "Got %d\n", pfdeimpl
->OnFolderChange
);
1213 pfdeimpl
->OnFolderChange
= 0;
1214 /* pfdeimpl->OnSelectionChange too unreliable to test. Can be 0, 1 or even 2. */
1215 pfdeimpl
->OnSelectionChange
= 0;
1216 /* Called once just by showing the dialog */
1217 ok(pfdeimpl
->OnTypeChange
== 1, "Got %d\n", pfdeimpl
->OnTypeChange
);
1218 pfdeimpl
->OnTypeChange
= 0;
1220 ensure_zero_events(pfdeimpl
);
1222 hr
= IFileDialog_Unadvise(pfd
, cookie
);
1223 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1225 IFileDialogEvents_Release(pfde
);
1226 ref
= IFileDialog_Release(pfd
);
1227 ok(!ref
|| broken(ref
/* win2008_64 (intermittently) */), "Got %d\n", ref
);
1231 * 3. Show the dialog with filetypes added and simulate manual change of filetype
1233 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1234 &IID_IFileDialog
, (void**)&pfd
);
1235 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1237 pfde
= IFileDialogEvents_Constructor();
1238 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
1239 pfdeimpl
->events_test
= IFDEVENT_TEST3
;
1241 hr
= IFileDialog_Advise(pfd
, pfde
, &cookie
);
1242 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1244 hr
= IFileDialog_SetFileTypes(pfd
, 2, filterspec
);
1245 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1247 ensure_zero_events(pfdeimpl
);
1249 hr
= IFileDialog_Show(pfd
, NULL
);
1250 ok(hr
== HRESULT_FROM_WIN32(ERROR_CANCELLED
), "got 0x%08x.\n", hr
);
1252 ok(pfdeimpl
->OnFolderChanging
== 1, "Got %d\n", pfdeimpl
->OnFolderChanging
);
1253 pfdeimpl
->OnFolderChanging
= 0;
1254 ok(pfdeimpl
->OnFolderChange
== 1, "Got %d\n", pfdeimpl
->OnFolderChange
);
1255 pfdeimpl
->OnFolderChange
= 0;
1256 /* pfdeimpl->OnSelectionChange too unreliable to test. Can be 0, 1 or even 2. */
1257 pfdeimpl
->OnSelectionChange
= 0;
1258 /* Called once by showing the dialog and once again when changing the filetype */
1259 todo_wine
ok(pfdeimpl
->OnTypeChange
== 2, "Got %d\n", pfdeimpl
->OnTypeChange
);
1260 pfdeimpl
->OnTypeChange
= 0;
1262 ensure_zero_events(pfdeimpl
);
1264 hr
= IFileDialog_Unadvise(pfd
, cookie
);
1265 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1267 IFileDialogEvents_Release(pfde
);
1268 ref
= IFileDialog_Release(pfd
);
1269 ok(!ref
|| broken(ref
/* win2008_64 (intermittently) */), "Got %d\n", ref
);
1272 static void touch_file(LPCWSTR filename
)
1275 file
= CreateFileW(filename
, GENERIC_WRITE
, 0, NULL
, CREATE_NEW
, FILE_ATTRIBUTE_NORMAL
, NULL
);
1276 ok(file
!= INVALID_HANDLE_VALUE
, "Failed to create file.\n");
1280 static void test_filename_savedlg_(LPCWSTR set_filename
, LPCWSTR defext
,
1281 const COMDLG_FILTERSPEC
*filterspec
, UINT fs_count
,
1282 LPCWSTR exp_filename
, const char *file
, int line
)
1284 IFileSaveDialog
*pfsd
;
1285 IFileDialogEventsImpl
*pfdeimpl
;
1286 IFileDialogEvents
*pfde
;
1293 hr
= CoCreateInstance(&CLSID_FileSaveDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1294 &IID_IFileSaveDialog
, (void**)&pfsd
);
1295 ok_(file
,line
)(hr
== S_OK
, "Got 0x%08x\n", hr
);
1299 hr
= IFileSaveDialog_SetFileTypes(pfsd
, fs_count
, filterspec
);
1300 ok_(file
,line
)(hr
== S_OK
, "SetFileTypes failed: Got 0x%08x\n", hr
);
1305 hr
= IFileSaveDialog_SetDefaultExtension(pfsd
, defext
);
1306 ok_(file
,line
)(hr
== S_OK
, "SetDefaultExtensions failed: Got 0x%08x\n", hr
);
1309 pfde
= IFileDialogEvents_Constructor();
1310 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
1311 pfdeimpl
->set_filename
= set_filename
;
1312 hr
= IFileSaveDialog_Advise(pfsd
, pfde
, &cookie
);
1313 ok_(file
,line
)(hr
== S_OK
, "Advise failed: Got 0x%08x\n", hr
);
1315 hr
= IFileSaveDialog_Show(pfsd
, NULL
);
1316 ok_(file
,line
)(hr
== S_OK
, "Show failed: Got 0x%08x\n", hr
);
1318 hr
= IFileSaveDialog_GetFileName(pfsd
, &filename
);
1319 ok_(file
,line
)(hr
== S_OK
, "GetFileName failed: Got 0x%08x\n", hr
);
1320 ok_(file
,line
)(!lstrcmpW(filename
, set_filename
), "Got %s\n", wine_dbgstr_w(filename
));
1321 CoTaskMemFree(filename
);
1323 hr
= IFileSaveDialog_GetResult(pfsd
, &psi
);
1324 ok_(file
,line
)(hr
== S_OK
, "GetResult failed: Got 0x%08x\n", hr
);
1326 hr
= IShellItem_GetDisplayName(psi
, SIGDN_PARENTRELATIVEPARSING
, &filename
);
1327 ok_(file
,line
)(hr
== S_OK
, "GetDisplayName failed: Got 0x%08x\n", hr
);
1328 ok_(file
,line
)(!lstrcmpW(filename
, exp_filename
), "(GetDisplayName) Got %s\n", wine_dbgstr_w(filename
));
1329 CoTaskMemFree(filename
);
1330 IShellItem_Release(psi
);
1332 hr
= IFileSaveDialog_Unadvise(pfsd
, cookie
);
1333 ok_(file
,line
)(hr
== S_OK
, "Unadvise failed: Got 0x%08x\n", hr
);
1335 ref
= IFileSaveDialog_Release(pfsd
);
1336 ok_(file
,line
)(!ref
, "Got refcount %d, should have been released.\n", ref
);
1338 IFileDialogEvents_Release(pfde
);
1340 #define test_filename_savedlg(set_filename, defext, filterspec, fs_count, exp_filename) \
1341 test_filename_savedlg_(set_filename, defext, filterspec, fs_count, exp_filename, __FILE__, __LINE__)
1343 static void test_filename_opendlg_(LPCWSTR set_filename
, IShellItem
*psi_current
, LPCWSTR defext
,
1344 const COMDLG_FILTERSPEC
*filterspec
, UINT fs_count
,
1345 LPCWSTR exp_filename
, const char *file
, int line
)
1347 IFileOpenDialog
*pfod
;
1348 IFileDialogEventsImpl
*pfdeimpl
;
1349 IFileDialogEvents
*pfde
;
1352 IShellItemArray
*psia
;
1357 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1358 &IID_IFileOpenDialog
, (void**)&pfod
);
1359 ok_(file
,line
)(hr
== S_OK
, "CoCreateInstance failed: Got 0x%08x\n", hr
);
1363 hr
= IFileOpenDialog_SetDefaultExtension(pfod
, defext
);
1364 ok_(file
,line
)(hr
== S_OK
, "SetDefaultExtensions failed: Got 0x%08x\n", hr
);
1369 hr
= IFileOpenDialog_SetFileTypes(pfod
, 2, filterspec
);
1370 ok_(file
,line
)(hr
== S_OK
, "SetFileTypes failed: Got 0x%08x\n", hr
);
1373 hr
= IFileOpenDialog_SetFolder(pfod
, psi_current
);
1374 ok_(file
,line
)(hr
== S_OK
, "SetFolder failed: Got 0x%08x\n", hr
);
1376 pfde
= IFileDialogEvents_Constructor();
1377 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
1378 pfdeimpl
->set_filename
= set_filename
;
1379 pfdeimpl
->set_filename_tried
= FALSE
;
1380 hr
= IFileOpenDialog_Advise(pfod
, pfde
, &cookie
);
1381 ok_(file
,line
)(hr
== S_OK
, "Advise failed: Got 0x%08x\n", hr
);
1383 hr
= IFileOpenDialog_Show(pfod
, NULL
);
1384 ok_(file
,line
)(hr
== S_OK
|| (!exp_filename
&& hr
== HRESULT_FROM_WIN32(ERROR_CANCELLED
)),
1385 "Show failed: Got 0x%08x\n", hr
);
1388 hr
= IFileOpenDialog_GetResult(pfod
, &psi
);
1389 ok_(file
,line
)(hr
== S_OK
, "GetResult failed: Got 0x%08x\n", hr
);
1391 hr
= IShellItem_GetDisplayName(psi
, SIGDN_PARENTRELATIVEPARSING
, &filename
);
1392 ok_(file
,line
)(hr
== S_OK
, "GetDisplayName(Result) failed: Got 0x%08x\n", hr
);
1393 ok_(file
,line
)(!lstrcmpW(filename
, exp_filename
), "(GetResult) Got %s\n", wine_dbgstr_w(filename
));
1394 CoTaskMemFree(filename
);
1395 IShellItem_Release(psi
);
1397 hr
= IFileOpenDialog_GetResults(pfod
, &psia
);
1398 ok_(file
,line
)(hr
== S_OK
, "GetResults failed: Got 0x%08x\n", hr
);
1399 hr
= IShellItemArray_GetItemAt(psia
, 0, &psi
);
1400 ok_(file
,line
)(hr
== S_OK
, "GetItemAt failed: Got 0x%08x\n", hr
);
1402 hr
= IShellItem_GetDisplayName(psi
, SIGDN_PARENTRELATIVEPARSING
, &filename
);
1403 ok_(file
,line
)(hr
== S_OK
, "GetDisplayName(Results) failed: Got 0x%08x\n", hr
);
1404 ok_(file
,line
)(!lstrcmpW(filename
, exp_filename
), "(GetResults) Got %s\n", wine_dbgstr_w(filename
));
1405 CoTaskMemFree(filename
);
1407 IShellItem_Release(psi
);
1408 IShellItemArray_Release(psia
);
1412 hr
= IFileOpenDialog_GetResult(pfod
, &psi
);
1413 ok_(file
,line
)(hr
== E_UNEXPECTED
, "GetResult: Got 0x%08x\n", hr
);
1415 hr
= IFileOpenDialog_GetResults(pfod
, &psia
);
1416 ok_(file
,line
)(hr
== E_FAIL
, "GetResults: Got 0x%08x\n", hr
);
1419 hr
= IFileOpenDialog_GetFileName(pfod
, &filename
);
1420 ok_(file
,line
)(hr
== S_OK
, "GetFileName failed: Got 0x%08x\n", hr
);
1421 ok_(file
,line
)(!lstrcmpW(filename
, set_filename
), "(GetFileName) Got %s\n", wine_dbgstr_w(filename
));
1422 CoTaskMemFree(filename
);
1425 hr
= IFileOpenDialog_Unadvise(pfod
, cookie
);
1426 ok_(file
,line
)(hr
== S_OK
, "Unadvise failed: Got 0x%08x\n", hr
);
1428 ref
= IFileOpenDialog_Release(pfod
);
1429 ok_(file
,line
)(!ref
, "Got refcount %d, should have been released.\n", ref
);
1431 IFileDialogEvents_Release(pfde
);
1433 #define test_filename_opendlg(set_filename, psi, defext, filterspec, fs_count, exp_filename) \
1434 test_filename_opendlg_(set_filename, psi, defext, filterspec, fs_count, exp_filename, __FILE__, __LINE__)
1436 static void test_filename(void)
1438 IShellItem
*psi_current
;
1440 WCHAR buf
[MAX_PATH
];
1442 static const WCHAR filename_noextW
[] = {'w','i','n','e','t','e','s','t',0};
1443 static const WCHAR filename_dotextW
[] = {'w','i','n','e','t','e','s','t','.',0};
1444 static const WCHAR filename_dotanddefW
[] = {'w','i','n','e','t','e','s','t','.','.','w','t','e',0};
1445 static const WCHAR filename_defextW
[] = {'w','i','n','e','t','e','s','t','.','w','t','e',0};
1446 static const WCHAR filename_ext1W
[] = {'w','i','n','e','t','e','s','t','.','w','t','1',0};
1447 static const WCHAR filename_ext2W
[] = {'w','i','n','e','t','e','s','t','.','w','t','2',0};
1448 static const WCHAR filename_ext1anddefW
[] =
1449 {'w','i','n','e','t','e','s','t','.','w','t','1','.','w','t','e',0};
1450 static const WCHAR defextW
[] = {'w','t','e',0};
1451 static const WCHAR desc1
[] = {'d','e','s','c','r','i','p','t','i','o','n','1',0};
1452 static const WCHAR desc2
[] = {'d','e','s','c','r','i','p','t','i','o','n','2',0};
1453 static const WCHAR descdef
[] = {'d','e','f','a','u','l','t',' ','d','e','s','c',0};
1454 static const WCHAR ext1
[] = {'*','.','w','t','1',0};
1455 static const WCHAR ext2
[] = {'*','.','w','t','2',0};
1456 static const WCHAR extdef
[] = {'*','.','w','t','e',0};
1457 static const WCHAR complexext
[] = {'*','.','w','t','2',';','*','.','w','t','1',0};
1459 static const COMDLG_FILTERSPEC filterspec
[] = {
1460 { desc1
, ext1
}, { desc2
, ext2
}, { descdef
, extdef
}
1462 static const COMDLG_FILTERSPEC filterspec2
[] = {
1463 { desc1
, complexext
}
1467 test_filename_savedlg(filename_noextW
, NULL
, NULL
, 0, filename_noextW
);
1468 /* Default extension */
1469 test_filename_savedlg(filename_noextW
, defextW
, NULL
, 0, filename_defextW
);
1470 /* Default extension on filename ending with a . */
1471 test_filename_savedlg(filename_dotextW
, defextW
, NULL
, 0, filename_dotanddefW
);
1472 /* Default extension on filename with default extension */
1473 test_filename_savedlg(filename_defextW
, defextW
, NULL
, 0, filename_defextW
);
1474 /* Default extension on filename with another extension */
1475 test_filename_savedlg(filename_ext1W
, defextW
, NULL
, 0, filename_ext1anddefW
);
1476 /* Default extension, filterspec without default extension */
1477 test_filename_savedlg(filename_noextW
, defextW
, filterspec
, 2, filename_ext1W
);
1478 /* Default extension, filterspec with default extension */
1479 test_filename_savedlg(filename_noextW
, defextW
, filterspec
, 3, filename_ext1W
);
1480 /* Default extension, filterspec with "complex" extension */
1481 test_filename_savedlg(filename_noextW
, defextW
, filterspec2
, 1, filename_ext2W
);
1483 GetCurrentDirectoryW(MAX_PATH
, buf
);
1484 ok(!!pSHCreateItemFromParsingName
, "SHCreateItemFromParsingName is missing.\n");
1485 hr
= pSHCreateItemFromParsingName(buf
, NULL
, &IID_IShellItem
, (void**)&psi_current
);
1486 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
1488 touch_file(filename_noextW
);
1489 touch_file(filename_defextW
);
1490 touch_file(filename_ext2W
);
1492 /* IFileOpenDialog, default extension */
1493 test_filename_opendlg(filename_noextW
, psi_current
, defextW
, NULL
, 0, filename_noextW
);
1494 /* IFileOpenDialog, default extension and filterspec */
1495 test_filename_opendlg(filename_noextW
, psi_current
, defextW
, filterspec
, 2, filename_noextW
);
1497 DeleteFileW(filename_noextW
);
1498 /* IFileOpenDialog, default extension, noextW deleted */
1499 test_filename_opendlg(filename_noextW
, psi_current
, defextW
, NULL
, 0, filename_defextW
);
1500 if(0) /* Interactive */
1502 /* IFileOpenDialog, filterspec, no default extension, noextW deleted */
1503 test_filename_opendlg(filename_noextW
, psi_current
, NULL
, filterspec
, 2, NULL
);
1506 IShellItem_Release(psi_current
);
1507 DeleteFileW(filename_defextW
);
1508 DeleteFileW(filename_ext2W
);
1511 static const WCHAR label
[] = {'l','a','b','e','l',0};
1512 static const WCHAR label2
[] = {'t','e','s','t',0};
1513 static const WCHAR menuW
[] = {'m','e','n','u','_','i','t','e','m',0};
1514 static const WCHAR pushbutton1W
[] = {'p','u','s','h','b','u','t','t','o','n','_','i','t','e','m',0};
1515 static const WCHAR pushbutton2W
[] = {'p','u','s','h','b','u','t','t','o','n','2','_','i','t','e','m',0};
1516 static const WCHAR comboboxitem1W
[] = {'c','o','m','b','o','b','o','x','1','_','i','t','e','m',0};
1517 static const WCHAR comboboxitem2W
[] = {'c','o','m','b','o','b','o','x','2','_','i','t','e','m',0};
1518 static const WCHAR radiobutton1W
[] = {'r','a','d','i','o','b','u','t','t','o','n','1','_','i','t','e','m',0};
1519 static const WCHAR radiobutton2W
[] = {'r','a','d','i','o','b','u','t','t','o','n','2','_','i','t','e','m',0};
1520 static const WCHAR checkbutton1W
[] = {'c','h','e','c','k','b','u','t','t','o','n','1','_','i','t','e','m',0};
1521 static const WCHAR checkbutton2W
[] = {'c','h','e','c','k','b','u','t','t','o','n','2','_','i','t','e','m',0};
1522 static const WCHAR editbox1W
[] = {'e','d','i','t','b','o','x','W','1','_','i','t','e','m',0};
1523 static const WCHAR editbox2W
[] = {'e','d','i','t','b','o','x','W','2','_','i','t','e','m',0};
1524 static const WCHAR textW
[] = {'t','e','x','t','_','i','t','e','m',0};
1525 static const WCHAR text2W
[] = {'t','e','x','t','2','_','i','t','e','m',0};
1526 static const WCHAR separatorW
[] = {'s','e','p','a','r','a','t','o','r','_','i','t','e','m',0};
1527 static const WCHAR visualgroup1W
[] = {'v','i','s','u','a','l','g','r','o','u','p','1',0};
1528 static const WCHAR visualgroup2W
[] = {'v','i','s','u','a','l','g','r','o','u','p','2',0};
1530 static const WCHAR floatnotifysinkW
[] = {'F','l','o','a','t','N','o','t','i','f','y','S','i','n','k',0};
1531 static const WCHAR RadioButtonListW
[] = {'R','a','d','i','o','B','u','t','t','o','n','L','i','s','t',0};
1533 static void test_customize_onfolderchange(IFileDialog
*pfd
)
1535 HWND dlg_hwnd
, item
, item_parent
;
1541 dlg_hwnd
= get_hwnd_from_ifiledialog(pfd
);
1542 ok(dlg_hwnd
!= NULL
, "Got NULL.\n");
1544 item
= find_window(dlg_hwnd
, NULL
, checkbutton2W
);
1545 ok(item
!= NULL
, "Failed to find item.\n");
1546 item_parent
= GetParent(item
);
1547 GetClassNameW(item_parent
, buf
, 1024);
1548 ok(!lstrcmpW(buf
, floatnotifysinkW
), "Got %s\n", wine_dbgstr_w(buf
));
1549 item
= find_window(dlg_hwnd
, NULL
, text2W
);
1550 ok(item
!= NULL
, "Failed to find item.\n");
1551 item_parent
= GetParent(item
);
1552 GetClassNameW(item_parent
, buf
, 1024);
1553 ok(!lstrcmpW(buf
, floatnotifysinkW
), "Got %s\n", wine_dbgstr_w(buf
));
1554 item
= find_window(dlg_hwnd
, NULL
, radiobutton1W
);
1555 todo_wine
ok(item
!= NULL
, "Failed to find item.\n");
1556 item_parent
= GetParent(item
);
1557 GetClassNameW(item_parent
, buf
, 1024);
1558 todo_wine
ok(!lstrcmpW(buf
, RadioButtonListW
), "Got %s\n", wine_dbgstr_w(buf
));
1559 item_parent
= GetParent(item_parent
);
1560 GetClassNameW(item_parent
, buf
, 1024);
1561 ok(!lstrcmpW(buf
, floatnotifysinkW
), "Got %s\n", wine_dbgstr_w(buf
));
1563 item
= find_window(dlg_hwnd
, NULL
, pushbutton1W
);
1564 ok(item
== NULL
, "Found item: %p\n", item
);
1565 item
= find_window(dlg_hwnd
, NULL
, pushbutton2W
);
1566 ok(item
== NULL
, "Found item: %p\n", item
);
1567 item
= find_window(dlg_hwnd
, NULL
, comboboxitem1W
);
1568 ok(item
== NULL
, "Found item: %p\n", item
);
1569 item
= find_window(dlg_hwnd
, NULL
, comboboxitem2W
);
1570 ok(item
== NULL
, "Found item: %p\n", item
);
1571 item
= find_window(dlg_hwnd
, NULL
, radiobutton2W
);
1572 ok(item
== NULL
, "Found item: %p\n", item
);
1573 item
= find_window(dlg_hwnd
, NULL
, checkbutton1W
);
1574 ok(item
== NULL
, "Found item: %p\n", item
);
1575 item
= find_window(dlg_hwnd
, NULL
, editbox1W
);
1576 ok(item
== NULL
, "Found item: %p\n", item
);
1577 item
= find_window(dlg_hwnd
, NULL
, editbox2W
);
1578 ok(item
== NULL
, "Found item: %p\n", item
);
1579 item
= find_window(dlg_hwnd
, NULL
, textW
);
1580 ok(item
== NULL
, "Found item: %p\n", item
);
1581 item
= find_window(dlg_hwnd
, NULL
, separatorW
);
1582 ok(item
== NULL
, "Found item: %p\n", item
);
1583 item
= find_window(dlg_hwnd
, NULL
, visualgroup1W
);
1584 ok(item
== NULL
, "Found item: %p\n", item
);
1585 item
= find_window(dlg_hwnd
, NULL
, visualgroup2W
);
1586 todo_wine
ok(item
== NULL
, "Found item: %p\n", item
);
1588 br
= PostMessageW(dlg_hwnd
, WM_COMMAND
, IDCANCEL
, 0);
1592 static void test_customize(void)
1595 IFileDialogCustomize
*pfdc
;
1596 IFileDialogEventsImpl
*pfdeimpl
;
1597 IFileDialogEvents
*pfde
;
1599 CDCONTROLSTATEF cdstate
;
1603 UINT id_vgroup1
, id_text
, id_editbox1
;
1607 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1608 &IID_IFileDialog
, (void**)&pfod
);
1609 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1611 hr
= IFileDialog_QueryInterface(pfod
, &IID_IFileDialogCustomize
, (void**)&pfdc
);
1612 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1615 skip("Skipping IFileDialogCustomize tests.\n");
1616 IFileDialog_Release(pfod
);
1621 hr
= IFileDialogCustomize_AddPushButton(pfdc
, i
, pushbutton1W
);
1622 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1623 hr
= IFileDialogCustomize_AddPushButton(pfdc
, i
, pushbutton1W
);
1624 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1626 hr
= IFileDialog_QueryInterface(pfod
, &IID_IOleWindow
, (void**)&pow
);
1627 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
1628 hr
= IOleWindow_GetWindow(pow
, &dlg_hwnd
);
1629 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
1630 ok(dlg_hwnd
== NULL
, "NULL\n");
1631 IOleWindow_Release(pow
);
1633 cdstate
= 0xdeadbeef;
1634 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1635 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1636 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1638 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1639 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
1641 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, label2
);
1642 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1644 hr
= IFileDialogCustomize_EnableOpenDropDown(pfdc
, i
);
1645 todo_wine
ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1646 hr
= IFileDialogCustomize_EnableOpenDropDown(pfdc
, ++i
);
1647 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1649 cdstate
= 0xdeadbeef;
1650 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1651 ok(hr
== E_NOTIMPL
, "got 0x%08x.\n", hr
);
1652 ok(cdstate
== 0xdeadbeef, "got 0x%08x.\n", cdstate
);
1654 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1655 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1656 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1657 todo_wine
ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
1659 cdstate
= 0xdeadbeef;
1660 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1661 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1662 todo_wine
ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1663 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, 0);
1664 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1665 cdstate
= 0xdeadbeef;
1666 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1667 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1668 todo_wine
ok(!cdstate
, "got 0x%08x.\n", cdstate
);
1669 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, CDCS_ENABLEDVISIBLE
);
1670 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1671 cdstate
= 0xdeadbeef;
1672 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1673 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1674 todo_wine
ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1676 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, label2
);
1677 todo_wine
ok(hr
== E_NOTIMPL
, "got 0x%08x (control: %d).\n", hr
, i
);
1679 hr
= IFileDialogCustomize_AddMenu(pfdc
, i
, menuW
);
1680 todo_wine
ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1681 hr
= IFileDialogCustomize_AddMenu(pfdc
, ++i
, label
);
1682 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1684 cdstate
= 0xdeadbeef;
1685 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1686 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1687 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1689 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1690 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1691 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1692 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
1694 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, label2
);
1695 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1697 hr
= IFileDialogCustomize_AddPushButton(pfdc
, i
, pushbutton2W
);
1698 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1699 hr
= IFileDialogCustomize_AddPushButton(pfdc
, ++i
, pushbutton2W
);
1700 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1702 cdstate
= 0xdeadbeef;
1703 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1704 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1705 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1707 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1708 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
1710 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, label2
);
1711 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1713 hr
= IFileDialogCustomize_AddComboBox(pfdc
, i
);
1714 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1715 hr
= IFileDialogCustomize_AddComboBox(pfdc
, ++i
);
1716 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1718 cdstate
= 0xdeadbeef;
1719 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1720 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1721 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1723 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1724 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1725 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1726 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
1728 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, label2
);
1729 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1731 hr
= IFileDialogCustomize_AddRadioButtonList(pfdc
, i
);
1732 todo_wine
ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1733 hr
= IFileDialogCustomize_AddRadioButtonList(pfdc
, ++i
);
1734 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1736 cdstate
= 0xdeadbeef;
1737 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1738 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1739 todo_wine
ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1741 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, radiobutton1W
);
1742 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1743 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, radiobutton1W
);
1744 todo_wine
ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
1746 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, radiobutton2W
);
1747 todo_wine
ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1749 hr
= IFileDialogCustomize_AddCheckButton(pfdc
, i
, label
, TRUE
);
1750 todo_wine
ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1751 hr
= IFileDialogCustomize_AddCheckButton(pfdc
, ++i
, checkbutton1W
, TRUE
);
1752 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1754 cdstate
= 0xdeadbeef;
1755 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1756 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1757 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1759 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1760 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
1762 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, checkbutton2W
);
1763 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1768 hr
= IFileDialogCustomize_GetCheckButtonState(pfdc
, i
, &checked
);
1769 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1770 ok(checked
, "checkbox not checked.\n");
1772 hr
= IFileDialogCustomize_SetCheckButtonState(pfdc
, i
, FALSE
);
1773 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1775 hr
= IFileDialogCustomize_GetCheckButtonState(pfdc
, i
, &checked
);
1776 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1777 ok(!checked
, "checkbox checked.\n");
1779 hr
= IFileDialogCustomize_SetCheckButtonState(pfdc
, i
, TRUE
);
1780 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1782 hr
= IFileDialogCustomize_GetCheckButtonState(pfdc
, i
, &checked
);
1783 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1784 ok(checked
, "checkbox not checked.\n");
1787 hr
= IFileDialogCustomize_AddEditBox(pfdc
, i
, label
);
1788 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1789 hr
= IFileDialogCustomize_AddEditBox(pfdc
, ++i
, editbox1W
);
1790 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1792 cdstate
= 0xdeadbeef;
1793 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1794 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1795 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1797 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1798 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
1800 /* Does not affect the text in the editbox */
1801 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, editbox2W
);
1802 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1804 hr
= IFileDialogCustomize_GetEditBoxText(pfdc
, i
, &tmpstr
);
1805 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1808 ok(!lstrcmpW(tmpstr
, editbox1W
), "got %s.\n", wine_dbgstr_w(tmpstr
));
1809 CoTaskMemFree(tmpstr
);
1812 hr
= IFileDialogCustomize_SetEditBoxText(pfdc
, i
, label2
);
1813 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1815 hr
= IFileDialogCustomize_GetEditBoxText(pfdc
, i
, &tmpstr
);
1816 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1819 ok(!lstrcmpW(tmpstr
, label2
), "got %s.\n", wine_dbgstr_w(tmpstr
));
1820 CoTaskMemFree(tmpstr
);
1823 hr
= IFileDialogCustomize_AddSeparator(pfdc
, i
);
1824 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1825 hr
= IFileDialogCustomize_AddSeparator(pfdc
, ++i
);
1826 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1828 cdstate
= 0xdeadbeef;
1829 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1830 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1831 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1833 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1834 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
1836 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, separatorW
);
1837 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1839 hr
= IFileDialogCustomize_AddText(pfdc
, i
, label
);
1840 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1841 hr
= IFileDialogCustomize_AddText(pfdc
, ++i
, textW
);
1842 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1844 cdstate
= 0xdeadbeef;
1845 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1846 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1847 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1849 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1850 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
1852 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, text2W
);
1853 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1855 hr
= IFileDialogCustomize_StartVisualGroup(pfdc
, i
, label
);
1856 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1857 hr
= IFileDialogCustomize_StartVisualGroup(pfdc
, ++i
, visualgroup1W
);
1858 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1860 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1861 ok(hr
== E_NOINTERFACE
, "got 0x%08x.\n", hr
);
1863 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, visualgroup2W
);
1864 ok(hr
== S_OK
, "got 0x%08x (control: %d).\n", hr
, i
);
1866 cdstate
= 0xdeadbeef;
1867 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1868 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1869 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1871 hr
= IFileDialogCustomize_StartVisualGroup(pfdc
, ++i
, label
);
1872 ok(hr
== E_UNEXPECTED
, "got 0x%08x.\n", hr
);
1873 hr
= IFileDialogCustomize_EndVisualGroup(pfdc
);
1874 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1876 i
++; /* Nonexisting control */
1877 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, 0, label
);
1878 todo_wine
ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
1879 hr
= IFileDialogCustomize_SetControlLabel(pfdc
, i
, label2
);
1880 ok(hr
== E_INVALIDARG
, "got 0x%08x (control: %d).\n", hr
, i
);
1881 cdstate
= 0xdeadbeef;
1882 hr
= IFileDialogCustomize_GetControlState(pfdc
, i
, &cdstate
);
1883 todo_wine
ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
1884 ok(cdstate
== 0xdeadbeef, "got 0x%08x.\n", cdstate
);
1886 pfde
= IFileDialogEvents_Constructor();
1887 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
1888 pfdeimpl
->events_test
= IFDEVENT_TEST1
;
1889 hr
= IFileDialog_Advise(pfod
, pfde
, &cookie
);
1890 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
1892 hr
= IFileDialog_Show(pfod
, NULL
);
1893 ok(hr
== HRESULT_FROM_WIN32(ERROR_CANCELLED
), "Got 0x%08x\n", hr
);
1895 hr
= IFileDialog_Unadvise(pfod
, cookie
);
1896 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
1898 IFileDialogEvents_Release(pfde
);
1899 IFileDialogCustomize_Release(pfdc
);
1900 ref
= IFileDialog_Release(pfod
);
1901 ok(!ref
, "Refcount not zero (%d).\n", ref
);
1904 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
1905 &IID_IFileDialog
, (void**)&pfod
);
1906 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1908 hr
= IFileDialog_QueryInterface(pfod
, &IID_IFileDialogCustomize
, (void**)&pfdc
);
1909 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1912 hr
= IFileDialogCustomize_AddMenu(pfdc
, ++i
, label
);
1913 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1919 for(j
= 0; j
< 10; j
++)
1921 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, j
, label
);
1922 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1925 hr
= IFileDialogCustomize_GetSelectedControlItem(pfdc
, i
, &selected
);
1926 ok(hr
== E_NOTIMPL
, "got 0x%08x.\n", hr
);
1928 cdstate
= 0xdeadbeef;
1929 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1930 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1931 todo_wine
ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1932 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, 0);
1933 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1934 cdstate
= 0xdeadbeef;
1935 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1936 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1937 todo_wine
ok(cdstate
== 0, "got 0x%08x.\n", cdstate
);
1938 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, CDCS_ENABLEDVISIBLE
);
1939 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1940 cdstate
= 0xdeadbeef;
1941 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1942 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1943 todo_wine
ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1945 hr
= IFileDialogCustomize_RemoveAllControlItems(pfdc
, i
);
1946 ok(hr
== E_NOTIMPL
, "got 0x%08x.\n", hr
);
1948 for(j
= 0; j
< 10; j
++)
1950 hr
= IFileDialogCustomize_RemoveControlItem(pfdc
, i
, j
);
1951 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1954 hr
= IFileDialogCustomize_AddPushButton(pfdc
, ++i
, label
);
1955 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1956 hr
= IFileDialogCustomize_AddComboBox(pfdc
, ++i
);
1957 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1960 DWORD selected
= -1;
1963 for(j
= 0; j
< 10; j
++)
1965 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, j
, label
);
1966 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1969 hr
= IFileDialogCustomize_GetSelectedControlItem(pfdc
, i
, &selected
);
1970 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
1971 ok(selected
== -1, "got %d.\n", selected
);
1974 cdstate
= 0xdeadbeef;
1975 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1976 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1977 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1978 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, 0);
1979 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1980 cdstate
= 0xdeadbeef;
1981 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1982 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1983 ok(cdstate
== 0, "got 0x%08x.\n", cdstate
);
1984 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, CDCS_ENABLEDVISIBLE
);
1985 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1986 cdstate
= 0xdeadbeef;
1987 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
1988 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1989 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
1992 for(j
= 0; j
< 10; j
++)
1994 hr
= IFileDialogCustomize_SetSelectedControlItem(pfdc
, i
, j
);
1995 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1996 hr
= IFileDialogCustomize_GetSelectedControlItem(pfdc
, i
, &selected
);
1997 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
1998 ok(selected
== j
, "got %d.\n", selected
);
2001 hr
= IFileDialogCustomize_SetSelectedControlItem(pfdc
, i
, j
);
2002 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
2004 hr
= IFileDialogCustomize_RemoveAllControlItems(pfdc
, i
);
2005 ok(hr
== E_NOTIMPL
, "got 0x%08x.\n", hr
);
2007 for(j
= 0; j
< 10; j
++)
2009 hr
= IFileDialogCustomize_RemoveControlItem(pfdc
, i
, j
);
2010 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2014 hr
= IFileDialogCustomize_AddRadioButtonList(pfdc
, ++i
);
2015 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2018 DWORD selected
= -1;
2021 for(j
= 0; j
< 10; j
++)
2023 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, j
, label
);
2024 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2027 hr
= IFileDialogCustomize_GetSelectedControlItem(pfdc
, i
, &selected
);
2028 ok(hr
== E_FAIL
, "got 0x%08x.\n", hr
);
2029 ok(selected
== -1, "got %d.\n", selected
);
2032 cdstate
= 0xdeadbeef;
2033 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
2034 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2035 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2036 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, 0);
2037 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2038 cdstate
= 0xdeadbeef;
2039 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
2040 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2041 ok(cdstate
== 0, "got 0x%08x.\n", cdstate
);
2042 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, CDCS_ENABLEDVISIBLE
);
2043 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2044 cdstate
= 0xdeadbeef;
2045 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
2046 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2047 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2050 for(j
= 0; j
< 10; j
++)
2052 hr
= IFileDialogCustomize_SetSelectedControlItem(pfdc
, i
, j
);
2053 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2054 hr
= IFileDialogCustomize_GetSelectedControlItem(pfdc
, i
, &selected
);
2055 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2056 ok(selected
== j
, "got %d.\n", selected
);
2059 hr
= IFileDialogCustomize_SetSelectedControlItem(pfdc
, i
, j
);
2060 ok(hr
== E_INVALIDARG
, "got 0x%08x.\n", hr
);
2062 hr
= IFileDialogCustomize_RemoveAllControlItems(pfdc
, i
);
2063 ok(hr
== E_NOTIMPL
, "got 0x%08x.\n", hr
);
2065 for(j
= 0; j
< 10; j
++)
2067 hr
= IFileDialogCustomize_RemoveControlItem(pfdc
, i
, j
);
2068 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2071 hr
= IFileDialogCustomize_EnableOpenDropDown(pfdc
, ++i
);
2072 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2075 DWORD selected
= -1;
2078 for(j
= 0; j
< 10; j
++)
2080 hr
= IFileDialogCustomize_AddControlItem(pfdc
, i
, j
, label
);
2081 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2084 hr
= IFileDialogCustomize_GetSelectedControlItem(pfdc
, i
, &selected
);
2085 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2086 ok(selected
== 0, "got %d.\n", selected
);
2088 cdstate
= 0xdeadbeef;
2089 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
2090 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2091 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2092 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, 0);
2093 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2094 cdstate
= 0xdeadbeef;
2095 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
2096 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2097 ok(cdstate
== 0, "got 0x%08x.\n", cdstate
);
2098 hr
= IFileDialogCustomize_SetControlItemState(pfdc
, i
, 0, CDCS_ENABLEDVISIBLE
);
2099 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2100 cdstate
= 0xdeadbeef;
2101 hr
= IFileDialogCustomize_GetControlItemState(pfdc
, i
, 0, &cdstate
);
2102 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2103 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2104 hr
= IFileDialogCustomize_SetSelectedControlItem(pfdc
, i
, 0);
2105 ok(hr
== E_NOTIMPL
, "got 0x%08x.\n", hr
);
2107 hr
= IFileDialogCustomize_RemoveAllControlItems(pfdc
, i
);
2108 ok(hr
== E_NOTIMPL
, "got 0x%08x.\n", hr
);
2110 for(j
= 0; j
< 10; j
++)
2112 hr
= IFileDialogCustomize_RemoveControlItem(pfdc
, i
, j
);
2113 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2117 IFileDialogCustomize_Release(pfdc
);
2118 ref
= IFileDialog_Release(pfod
);
2119 ok(!ref
, "Refcount not zero (%d).\n", ref
);
2122 /* Some more tests for VisualGroup behavior */
2123 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
2124 &IID_IFileDialog
, (void**)&pfod
);
2125 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2127 hr
= IFileDialog_QueryInterface(pfod
, &IID_IFileDialogCustomize
, (void**)&pfdc
);
2128 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2132 hr
= IFileDialogCustomize_StartVisualGroup(pfdc
, id_vgroup1
, visualgroup1W
);
2133 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2135 cdstate
= 0xdeadbeef;
2136 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_vgroup1
, &cdstate
);
2137 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2138 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2141 hr
= IFileDialogCustomize_AddText(pfdc
, id_text
, label
);
2142 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2144 cdstate
= 0xdeadbeef;
2145 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_text
, &cdstate
);
2146 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2147 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2150 hr
= IFileDialogCustomize_AddEditBox(pfdc
, id_editbox1
, editbox1W
);
2151 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2153 cdstate
= 0xdeadbeef;
2154 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_editbox1
, &cdstate
);
2155 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2156 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2159 /* Set all Visible but not Enabled */
2160 hr
= IFileDialogCustomize_SetControlState(pfdc
, id_vgroup1
, CDCS_VISIBLE
);
2161 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2163 cdstate
= 0xdeadbeef;
2164 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_vgroup1
, &cdstate
);
2165 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2166 ok(cdstate
== CDCS_VISIBLE
, "got 0x%08x.\n", cdstate
);
2167 cdstate
= 0xdeadbeef;
2169 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_text
, &cdstate
);
2170 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2171 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2173 cdstate
= 0xdeadbeef;
2174 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_editbox1
, &cdstate
);
2175 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2176 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2178 /* Set text to Visible but not Enabled */
2179 hr
= IFileDialogCustomize_SetControlState(pfdc
, id_text
, CDCS_VISIBLE
);
2180 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2182 cdstate
= 0xdeadbeef;
2183 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_vgroup1
, &cdstate
);
2184 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2185 ok(cdstate
== CDCS_VISIBLE
, "got 0x%08x.\n", cdstate
);
2186 cdstate
= 0xdeadbeef;
2188 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_text
, &cdstate
);
2189 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2190 ok(cdstate
== CDCS_VISIBLE
, "got 0x%08x.\n", cdstate
);
2192 cdstate
= 0xdeadbeef;
2193 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_editbox1
, &cdstate
);
2194 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2195 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2197 /* Set vgroup to inactive */
2198 hr
= IFileDialogCustomize_SetControlState(pfdc
, id_vgroup1
, CDCS_INACTIVE
);
2199 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2201 cdstate
= 0xdeadbeef;
2202 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_vgroup1
, &cdstate
);
2203 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2204 ok(cdstate
== CDCS_INACTIVE
, "got 0x%08x.\n", cdstate
);
2206 cdstate
= 0xdeadbeef;
2207 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_text
, &cdstate
);
2208 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2209 ok(cdstate
== CDCS_VISIBLE
, "got 0x%08x.\n", cdstate
);
2211 cdstate
= 0xdeadbeef;
2212 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_editbox1
, &cdstate
);
2213 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2214 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2216 /* Set vgroup to Enabled and Visible again */
2217 hr
= IFileDialogCustomize_SetControlState(pfdc
, id_vgroup1
, CDCS_ENABLEDVISIBLE
);
2218 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2220 cdstate
= 0xdeadbeef;
2221 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_vgroup1
, &cdstate
);
2222 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2223 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2225 cdstate
= 0xdeadbeef;
2226 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_text
, &cdstate
);
2227 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2228 ok(cdstate
== CDCS_VISIBLE
, "got 0x%08x.\n", cdstate
);
2230 cdstate
= 0xdeadbeef;
2231 hr
= IFileDialogCustomize_GetControlState(pfdc
, id_editbox1
, &cdstate
);
2232 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2233 ok(cdstate
== CDCS_ENABLEDVISIBLE
, "got 0x%08x.\n", cdstate
);
2235 hr
= IFileDialogCustomize_MakeProminent(pfdc
, id_vgroup1
);
2236 todo_wine
ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2238 IFileDialogCustomize_Release(pfdc
);
2239 ref
= IFileDialog_Release(pfod
);
2240 ok(!ref
, "Refcount not zero (%d).\n", ref
);
2243 static void test_persistent_state(void)
2248 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
2249 &IID_IFileDialog
, (void**)&fd
);
2250 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2254 /* crashes at least on Win8 */
2255 hr
= IFileDialog_SetClientGuid(fd
, NULL
);
2258 hr
= IFileDialog_SetClientGuid(fd
, &IID_IUnknown
);
2259 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
2261 hr
= IFileDialog_SetClientGuid(fd
, &IID_NULL
);
2262 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
2264 IFileDialog_Release(fd
);
2267 static void test_overwrite(void)
2269 static const WCHAR filename_winetest
[] = {'w','i','n','e','t','e','s','t','.','o','v','w',0};
2270 IFileDialogEventsImpl
*pfdeimpl
;
2271 IFileDialogEvents
*pfde
;
2275 IShellItem
*psi_current
;
2276 WCHAR buf
[MAX_PATH
];
2279 GetCurrentDirectoryW(MAX_PATH
, buf
);
2280 ok(!!pSHCreateItemFromParsingName
, "SHCreateItemFromParsingName is missing.\n");
2281 hr
= pSHCreateItemFromParsingName(buf
, NULL
, &IID_IShellItem
, (void**)&psi_current
);
2282 ok(hr
== S_OK
, "Got 0x%08x\n", hr
);
2284 touch_file(filename_winetest
);
2286 /* FOS_OVERWRITEPROMPT has no effect on open dialog */
2287 hr
= CoCreateInstance(&CLSID_FileOpenDialog
, NULL
, CLSCTX_INPROC_SERVER
,
2288 &IID_IFileDialog
, (void**)&fd
);
2289 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2291 hr
= IFileDialog_SetOptions(fd
, FOS_OVERWRITEPROMPT
| FOS_NOCHANGEDIR
);
2292 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2294 hr
= IFileDialog_SetFolder(fd
, psi_current
);
2295 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2297 pfde
= IFileDialogEvents_Constructor();
2298 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
2299 pfdeimpl
->set_filename
= filename_winetest
;
2300 hr
= IFileDialog_Advise(fd
, pfde
, &cookie
);
2301 ok(hr
== S_OK
, "Advise failed: Got 0x%08x\n", hr
);
2303 hr
= IFileDialog_Show(fd
, NULL
);
2304 ok(hr
== S_OK
, "Show failed: Got 0x%08x\n", hr
);
2306 ok(!pfdeimpl
->OnOverwrite
, "got %u overwrite events\n", pfdeimpl
->OnOverwrite
);
2307 ok(pfdeimpl
->OnFileOk
== 1, "got %u ok events\n", pfdeimpl
->OnFileOk
);
2309 hr
= IFileDialog_GetFileName(fd
, &filename
);
2310 ok(hr
== S_OK
, "GetFileName failed: Got 0x%08x\n", hr
);
2311 ok(!lstrcmpW(filename
, filename_winetest
), "Got %s\n", wine_dbgstr_w(filename
));
2312 CoTaskMemFree(filename
);
2314 hr
= IFileDialog_Unadvise(fd
, cookie
);
2315 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2317 IFileDialog_Release(fd
);
2319 IFileDialogEvents_Release(pfde
);
2321 /* Save dialog doesn't check for overwrite without FOS_OVERWRITEPROMPT set */
2322 hr
= CoCreateInstance(&CLSID_FileSaveDialog
, NULL
, CLSCTX_INPROC_SERVER
,
2323 &IID_IFileDialog
, (void**)&fd
);
2324 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2326 hr
= IFileDialog_SetOptions(fd
, FOS_NOREADONLYRETURN
| FOS_PATHMUSTEXIST
| FOS_NOCHANGEDIR
);
2327 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2329 hr
= IFileDialog_SetFolder(fd
, psi_current
);
2330 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2332 pfde
= IFileDialogEvents_Constructor();
2333 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
2334 pfdeimpl
->set_filename
= filename_winetest
;
2335 hr
= IFileDialog_Advise(fd
, pfde
, &cookie
);
2336 ok(hr
== S_OK
, "Advise failed: Got 0x%08x\n", hr
);
2338 hr
= IFileDialog_Show(fd
, NULL
);
2339 ok(hr
== S_OK
, "Show failed: Got 0x%08x\n", hr
);
2341 ok(!pfdeimpl
->OnOverwrite
, "got %u overwrite events\n", pfdeimpl
->OnOverwrite
);
2342 ok(pfdeimpl
->OnFileOk
== 1, "got %u ok events\n", pfdeimpl
->OnFileOk
);
2344 hr
= IFileDialog_GetFileName(fd
, &filename
);
2345 ok(hr
== S_OK
, "GetFileName failed: Got 0x%08x\n", hr
);
2346 ok(!lstrcmpW(filename
, filename_winetest
), "Got %s\n", wine_dbgstr_w(filename
));
2347 CoTaskMemFree(filename
);
2349 hr
= IFileDialog_Unadvise(fd
, cookie
);
2350 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2352 IFileDialog_Release(fd
);
2354 IFileDialogEvents_Release(pfde
);
2356 /* Save dialog with FOS_OVERWRITEPROMPT set */
2357 hr
= CoCreateInstance(&CLSID_FileSaveDialog
, NULL
, CLSCTX_INPROC_SERVER
,
2358 &IID_IFileDialog
, (void**)&fd
);
2359 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2361 hr
= IFileDialog_SetFolder(fd
, psi_current
);
2362 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2364 pfde
= IFileDialogEvents_Constructor();
2365 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
2366 pfdeimpl
->set_filename
= filename_winetest
;
2367 hr
= IFileDialog_Advise(fd
, pfde
, &cookie
);
2368 ok(hr
== S_OK
, "Advise failed: Got 0x%08x\n", hr
);
2370 hr
= IFileDialog_Show(fd
, NULL
);
2371 ok(hr
== S_OK
, "Show failed: Got 0x%08x\n", hr
);
2373 ok(pfdeimpl
->OnOverwrite
== 1, "got %u overwrite events\n", pfdeimpl
->OnOverwrite
);
2374 ok(pfdeimpl
->OnFileOk
== 1, "got %u ok events\n", pfdeimpl
->OnFileOk
);
2376 hr
= IFileDialog_GetFileName(fd
, &filename
);
2377 ok(hr
== S_OK
, "GetFileName failed: Got 0x%08x\n", hr
);
2378 ok(!lstrcmpW(filename
, filename_winetest
), "Got %s\n", wine_dbgstr_w(filename
));
2379 CoTaskMemFree(filename
);
2381 hr
= IFileDialog_Unadvise(fd
, cookie
);
2382 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2384 IFileDialog_Release(fd
);
2386 IFileDialogEvents_Release(pfde
);
2388 DeleteFileW(filename_winetest
);
2390 /* Save dialog with FOS_OVERWRITEPROMPT set but without existing file */
2391 hr
= CoCreateInstance(&CLSID_FileSaveDialog
, NULL
, CLSCTX_INPROC_SERVER
,
2392 &IID_IFileDialog
, (void**)&fd
);
2393 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2395 hr
= IFileDialog_SetFolder(fd
, psi_current
);
2396 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2398 pfde
= IFileDialogEvents_Constructor();
2399 pfdeimpl
= impl_from_IFileDialogEvents(pfde
);
2400 pfdeimpl
->set_filename
= filename_winetest
;
2401 hr
= IFileDialog_Advise(fd
, pfde
, &cookie
);
2402 ok(hr
== S_OK
, "Advise failed: Got 0x%08x\n", hr
);
2404 hr
= IFileDialog_Show(fd
, NULL
);
2405 ok(hr
== S_OK
, "Show failed: Got 0x%08x\n", hr
);
2407 ok(!pfdeimpl
->OnOverwrite
, "got %u overwrite events\n", pfdeimpl
->OnOverwrite
);
2408 ok(pfdeimpl
->OnFileOk
== 1, "got %u ok events\n", pfdeimpl
->OnFileOk
);
2410 hr
= IFileDialog_GetFileName(fd
, &filename
);
2411 ok(hr
== S_OK
, "GetFileName failed: Got 0x%08x\n", hr
);
2412 ok(!lstrcmpW(filename
, filename_winetest
), "Got %s\n", wine_dbgstr_w(filename
));
2413 CoTaskMemFree(filename
);
2415 hr
= IFileDialog_Unadvise(fd
, cookie
);
2416 ok(hr
== S_OK
, "got 0x%08x.\n", hr
);
2418 IFileDialog_Release(fd
);
2420 IFileDialogEvents_Release(pfde
);
2422 IShellItem_Release(psi_current
);
2427 OleInitialize(NULL
);
2428 init_function_pointers();
2430 if(test_instantiation())
2437 test_persistent_state();
2441 skip("Skipping all Item Dialog tests.\n");