2 * Unit test suite for comdlg32 API functions: file dialogs
4 * Copyright 2007 Google (Lei Zhang)
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
23 #include <wine/test.h>
32 static UINT_PTR CALLBACK
OFNHookProc( HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
38 nmh
= (LPNMHDR
) lParam
;
39 if( nmh
->code
== CDN_INITDONE
)
41 PostMessage( GetParent(hDlg
), WM_COMMAND
, IDCANCEL
, FALSE
);
42 } else if (nmh
->code
== CDN_FOLDERCHANGE
)
47 memset(buf
, 0x66, sizeof(buf
));
48 ret
= SendMessage( GetParent(hDlg
), CDM_GETFOLDERIDLIST
, 5, (LPARAM
)buf
);
49 ok(ret
> 0, "CMD_GETFOLDERIDLIST not implemented\n");
51 ok(buf
[0] == 0x66 && buf
[1] == 0x66, "CMD_GETFOLDERIDLIST: The buffer was touched on failure\n");
59 static void test_DialogCancel(void)
63 char szFileName
[MAX_PATH
] = "";
64 char szInitialDir
[MAX_PATH
];
66 GetWindowsDirectory(szInitialDir
, MAX_PATH
);
68 ZeroMemory(&ofn
, sizeof(ofn
));
70 ofn
.lStructSize
= sizeof(ofn
);
72 ofn
.lpstrFilter
= "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
73 ofn
.lpstrFile
= szFileName
;
74 ofn
.nMaxFile
= MAX_PATH
;
75 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
| OFN_HIDEREADONLY
| OFN_ENABLEHOOK
;
76 ofn
.lpstrDefExt
= "txt";
77 ofn
.lpfnHook
= OFNHookProc
;
78 ofn
.lpstrInitialDir
= szInitialDir
;
81 ok(CDERR_INITIALIZATION
== CommDlgExtendedError(), "expected %d, got %d\n",
82 CDERR_INITIALIZATION
, CommDlgExtendedError());
84 result
= GetOpenFileNameA(&ofn
);
85 ok(0 == result
, "expected %d, got %d\n", 0, result
);
86 ok(0 == CommDlgExtendedError(), "expected %d, got %d\n", 0,
87 CommDlgExtendedError());
90 ok(CDERR_INITIALIZATION
== CommDlgExtendedError(), "expected %d, got %d\n",
91 CDERR_INITIALIZATION
, CommDlgExtendedError());
93 result
= GetSaveFileNameA(&ofn
);
94 ok(0 == result
, "expected %d, got %d\n", 0, result
);
95 ok(0 == CommDlgExtendedError(), "expected %d, got %d\n", 0,
96 CommDlgExtendedError());
99 ok(CDERR_INITIALIZATION
== CommDlgExtendedError(), "expected %d, got %d\n",
100 CDERR_INITIALIZATION
, CommDlgExtendedError());
102 /* Before passing the ofn to Unicode functions, remove the ANSI strings */
103 ofn
.lpstrFilter
= NULL
;
104 ofn
.lpstrInitialDir
= NULL
;
105 ofn
.lpstrDefExt
= NULL
;
108 ok(CDERR_INITIALIZATION
== CommDlgExtendedError(), "expected %d, got %d\n",
109 CDERR_INITIALIZATION
, CommDlgExtendedError());
111 SetLastError(0xdeadbeef);
112 result
= GetOpenFileNameW((LPOPENFILENAMEW
) &ofn
);
113 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
114 win_skip("GetOpenFileNameW is not implemented\n");
117 ok(0 == result
, "expected %d, got %d\n", 0, result
);
118 ok(0 == CommDlgExtendedError() ||
119 CDERR_INITIALIZATION
== CommDlgExtendedError(), /* win9x */
120 "expected %d or %d, got %d\n", 0, CDERR_INITIALIZATION
,
121 CommDlgExtendedError());
124 SetLastError(0xdeadbeef);
125 result
= GetSaveFileNameW((LPOPENFILENAMEW
) &ofn
);
126 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
127 win_skip("GetSaveFileNameW is not implemented\n");
130 ok(0 == result
, "expected %d, got %d\n", 0, result
);
131 ok(0 == CommDlgExtendedError() ||
132 CDERR_INITIALIZATION
== CommDlgExtendedError(), /* win9x */
133 "expected %d or %d, got %d\n", 0, CDERR_INITIALIZATION
,
134 CommDlgExtendedError());
138 static UINT_PTR CALLBACK
create_view_window2_hook(HWND dlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
140 if (msg
== WM_NOTIFY
)
142 if (((LPNMHDR
)lParam
)->code
== CDN_FOLDERCHANGE
)
144 IShellBrowser
*shell_browser
= (IShellBrowser
*)SendMessage(GetParent(dlg
), WM_USER
+ 7 /* WM_GETISHELLBROWSER */, 0, 0);
145 IShellView
*shell_view
= NULL
;
146 IShellView2
*shell_view2
= NULL
;
147 SV2CVW2_PARAMS view_params
;
148 FOLDERSETTINGS folder_settings
;
150 RECT rect
= {0, 0, 0, 0};
152 hr
= IShellBrowser_QueryActiveShellView(shell_browser
, &shell_view
);
153 ok(SUCCEEDED(hr
), "QueryActiveShellView returned %#x\n", hr
);
154 if (FAILED(hr
)) goto cleanup
;
156 hr
= IShellView_QueryInterface(shell_view
, &IID_IShellView2
, (void **)&shell_view2
);
157 if (hr
== E_NOINTERFACE
)
159 win_skip("IShellView2 not supported\n");
162 ok(SUCCEEDED(hr
), "QueryInterface returned %#x\n", hr
);
163 if (FAILED(hr
)) goto cleanup
;
165 hr
= IShellView2_DestroyViewWindow(shell_view2
);
166 ok(SUCCEEDED(hr
), "DestroyViewWindow returned %#x\n", hr
);
168 folder_settings
.ViewMode
= FVM_LIST
;
169 folder_settings
.fFlags
= 0;
171 view_params
.cbSize
= sizeof(view_params
);
172 view_params
.psvPrev
= NULL
;
173 view_params
.pfs
= &folder_settings
;
174 view_params
.psbOwner
= shell_browser
;
175 view_params
.prcView
= &rect
;
176 view_params
.pvid
= NULL
;
177 view_params
.hwndView
= NULL
;
179 hr
= IShellView2_CreateViewWindow2(shell_view2
, &view_params
);
180 ok(SUCCEEDED(hr
), "CreateViewWindow2 returned %#x\n", hr
);
181 if (FAILED(hr
)) goto cleanup
;
183 hr
= IShellView2_GetCurrentInfo(shell_view2
, &folder_settings
);
184 ok(SUCCEEDED(hr
), "GetCurrentInfo returned %#x\n", hr
);
185 ok(folder_settings
.ViewMode
== FVM_LIST
, "view mode is %d, expected %d\n", folder_settings
.ViewMode
, FVM_LIST
);
187 hr
= IShellView2_DestroyViewWindow(shell_view2
);
188 ok(SUCCEEDED(hr
), "DestroyViewWindow returned %#x\n", hr
);
190 /* XP and W2K3 need this. On Win9x and W2K the call to DestroyWindow() fails and has
191 * no side effects. NT4 doesn't get here. (FIXME: Vista doesn't get here yet).
193 DestroyWindow(view_params
.hwndView
);
195 view_params
.pvid
= &VID_Details
;
196 hr
= IShellView2_CreateViewWindow2(shell_view2
, &view_params
);
197 ok(SUCCEEDED(hr
), "CreateViewWindow2 returned %#x\n", hr
);
198 if (FAILED(hr
)) goto cleanup
;
200 hr
= IShellView2_GetCurrentInfo(shell_view2
, &folder_settings
);
201 ok(SUCCEEDED(hr
), "GetCurrentInfo returned %#x\n", hr
);
202 ok(folder_settings
.ViewMode
== FVM_DETAILS
||
203 broken(folder_settings
.ViewMode
== FVM_LIST
), /* Win9x */
204 "view mode is %d, expected %d\n", folder_settings
.ViewMode
, FVM_DETAILS
);
207 if (shell_view2
) IShellView2_Release(shell_view2
);
208 if (shell_view
) IShellView_Release(shell_view
);
209 PostMessage(GetParent(dlg
), WM_COMMAND
, IDCANCEL
, 0);
215 static LONG_PTR WINAPI
template_hook(HWND dlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
217 if (msg
== WM_INITDIALOG
)
222 ok(p
!=NULL
, "Failed to get parent of template\n");
223 cb
= GetDlgItem(p
,0x470);
224 ok(cb
!=NULL
, "Failed to get filter combobox\n");
225 sel
= SendMessage(cb
, CB_GETCURSEL
, 0, 0);
226 ok (sel
!= -1, "Failed to get selection from filter listbox\n");
228 if (msg
== WM_NOTIFY
)
230 if (((LPNMHDR
)lParam
)->code
== CDN_FOLDERCHANGE
)
231 PostMessage(GetParent(dlg
), WM_COMMAND
, IDCANCEL
, 0);
236 static void test_create_view_window2(void)
238 OPENFILENAMEA ofn
= {0};
239 char filename
[1024] = {0};
242 ofn
.lStructSize
= sizeof(ofn
);
243 ofn
.lpstrFile
= filename
;
245 ofn
.lpfnHook
= create_view_window2_hook
;
246 ofn
.Flags
= OFN_ENABLEHOOK
| OFN_EXPLORER
;
247 ret
= GetOpenFileNameA(&ofn
);
248 ok(!ret
, "GetOpenFileNameA returned %#x\n", ret
);
249 ret
= CommDlgExtendedError();
250 ok(!ret
, "CommDlgExtendedError returned %#x\n", ret
);
253 static void test_create_view_template(void)
255 OPENFILENAMEA ofn
= {0};
256 char filename
[1024] = {0};
259 ofn
.lStructSize
= sizeof(ofn
);
260 ofn
.lpstrFile
= filename
;
262 ofn
.lpfnHook
= (LPOFNHOOKPROC
)template_hook
;
263 ofn
.Flags
= OFN_ENABLEHOOK
| OFN_EXPLORER
| OFN_ENABLETEMPLATE
;
264 ofn
.hInstance
= GetModuleHandleA(NULL
);
265 ofn
.lpTemplateName
= "template1";
266 ofn
.lpstrFilter
="text\0*.txt\0All\0*\0\0";
267 ret
= GetOpenFileNameA(&ofn
);
268 ok(!ret
, "GetOpenFileNameA returned %#x\n", ret
);
269 ret
= CommDlgExtendedError();
270 ok(!ret
, "CommDlgExtendedError returned %#x\n", ret
);
276 test_create_view_window2();
277 test_create_view_template();