Merge the following revisions from kernel-fun branch:
[reactos.git] / rostests / apitests / com / shell32.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: COM interface test for shell32 classes
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #include "com_apitest.h"
9
10 #define NDEBUG
11 #include <debug.h>
12
13 static const CLASS_AND_INTERFACES ExpectedInterfaces[] =
14 {
15 {
16 ID_NAME(CLSID_CDBurn),
17 {
18 { 0x0, &IID_IObjectWithSite },
19 { 0x0, &IID_IUnknown },
20 { 0x8, &IID_IShellExtInit },
21 { 0xc, &IID_IContextMenu },
22 { 0x10, &IID_IShellPropSheetExt },
23 { 0x18, &IID_IDropTarget },
24 { 0x1c, &IID_IPersistFile },
25 { 0x20, &IID_IOleCommandTarget },
26 { 0x24, &IID_ICDBurn },
27 { 0x2c, &IID_IPersistPropertyBag },
28 { 0x3c, &IID_IServiceProvider },
29 }
30 },
31 {
32 ID_NAME(CLSID_ControlPanel),
33 {
34 { 0x0, &IID_IUnknown },
35 { 0x10, &IID_IPersistFolder2 },
36 { 0x10, &IID_IPersistFolder },
37 { 0x10, &IID_IPersist },
38 { FARAWY, &IID_IShellIconOverlay },
39 { FARAWY, &IID_IShellFolder2 },
40 { FARAWY, &IID_IShellFolder },
41 }
42 },
43 {
44 ID_NAME(CLSID_CopyToMenu),
45 {
46 { 0x0, &IID_IContextMenu3 },
47 { 0x0, &IID_IContextMenu2 },
48 { 0x0, &IID_IContextMenu },
49 { 0x0, &IID_IUnknown },
50 { 0x4, &IID_IShellExtInit },
51 { 0x8, &IID_IObjectWithSite },
52 { 0x10, &IID_IFolderFilter },
53 }
54 },
55 {
56 ID_NAME(CLSID_DeskMovr),
57 {
58 { 0x0, &IID_IUnknown },
59 { 0x70, &IID_IDeskMovr },
60 { 0x74, &IID_IOleObject },
61 { 0x78, &IID_IPersistPropertyBag },
62 { 0x80, &IID_IOleInPlaceActiveObject },
63 { 0x84, &IID_IViewObjectEx },
64 { 0x84, &IID_IViewObject2 },
65 { 0x84, &IID_IViewObject },
66 { 0x88, &IID_IOleWindow },
67 { 0x88, &IID_IOleInPlaceObject },
68 { 0x88, &IID_IOleInPlaceObjectWindowless },
69 }
70 },
71 {
72 ID_NAME(CLSID_DragDropHelper),
73 {
74 { 0x0, &IID_IDragSourceHelper },
75 { 0x0, &IID_IUnknown },
76 { 0x4, &IID_IDropTargetHelper },
77 }
78 },
79 {
80 ID_NAME(CLSID_FadeTask),
81 {
82 { 0x0, &IID_IUnknown },
83 }
84 },
85 {
86 ID_NAME(CLSID_FileSearchBand),
87 {
88 { 0x0, &IID_IFileSearchBand },
89 { 0x0, &IID_IDispatch },
90 { 0x0, &IID_IUnknown },
91 { 0x4, &IID_IObjectWithSite },
92 { 0x8, &IID_IPersistStream },
93 { 0x8, &IID_IPersist },
94 { 0xc, &IID_IDeskBand },
95 { 0xc, &IID_IDockingWindow },
96 { 0xc, &IID_IOleWindow },
97 { 0x10, &IID_IInputObject },
98 { 0x18, &IID_IOleInPlaceSite },
99 }
100 },
101 {
102 ID_NAME(CLSID_FolderItem),
103 {
104 //{ 0x0, &CLSID_ShellFolderItem }, // broken QueryInterface that doesn't add a reference
105 { 0x0, &IID_FolderItem2 },
106 { 0x0, &IID_FolderItem },
107 { 0x0, &IID_IDispatch },
108 { 0x0, &IID_IUnknown },
109 { 0x4, &IID_IPersistFolder2 },
110 { 0x4, &IID_IPersistFolder },
111 { 0x4, &IID_IPersist },
112 { 0x8, &IID_IObjectSafety },
113 }
114 },
115 {
116 ID_NAME(CLSID_FolderItemsFDF),
117 {
118 { 0x0, &IID_FolderItems3 },
119 //{ 0x0, &IID_FolderItems2 }, ????
120 { 0x0, &IID_FolderItems },
121 { 0x0, &IID_IDispatch },
122 { 0x0, &IID_IUnknown },
123 { 0x4, &IID_IPersistFolder },
124 { 0x8, &IID_IObjectSafety },
125 }
126 },
127 {
128 ID_NAME(CLSID_FolderShortcut),
129 {
130 { 0x0, &IID_IShellFolder2 },
131 { 0x0, &IID_IShellFolder },
132 { 0x0, &IID_IUnknown },
133 { 0x4, &IID_IPersistFolder3 },
134 { 0x4, &IID_IPersistFolder2 },
135 { 0x4, &IID_IPersistFolder },
136 { 0x4, &IID_IPersist },
137 { 0x8, &IID_IShellLinkA },
138 { 0xc, &IID_IShellLinkW },
139 { 0x10, &IID_IPersistFile },
140 { 0x14, &IID_IExtractIconW },
141 { 0x18, &IID_IQueryInfo },
142 { 0x20, &IID_IPersistStream },
143 { 0x20, &IID_IPersistStreamInit },
144 { 0x24, &IID_IPersistPropertyBag },
145 { 0x28, &IID_IBrowserFrameOptions },
146 }
147 },
148 {
149 ID_NAME(CLSID_FolderViewHost),
150 {
151 { 0x0, &IID_IFolderViewHost },
152 { 0x0, &IID_IUnknown },
153 { 0x4, &IID_IServiceProvider },
154 { 0x8, &IID_IOleWindow },
155 { 0xc, &IID_IFolderView },
156 { 0x10, &IID_IObjectWithSite },
157 }
158 },
159 {
160 ID_NAME(CLSID_ISFBand),
161 {
162 { -0xac, &IID_IDeskBand },
163 { -0xac, &IID_IDockingWindow },
164 { -0xac, &IID_IOleWindow },
165 { -0xa8, &IID_IObjectWithSite },
166 { -0xa0, &IID_IInputObject },
167 { -0x9c, &IID_IPersistStream },
168 { -0x9c, &IID_IPersist },
169 { -0x98, &IID_IOleCommandTarget },
170 { -0x94, &IID_IServiceProvider },
171 { -0x78, &IID_IWinEventHandler },
172 { -0x74, &IID_IShellChangeNotify },
173 { -0x70, &IID_IDropTarget },
174 { -0x4, &IID_IContextMenu },
175 { 0x0, &IID_IShellFolderBand },
176 { 0x0, &IID_IUnknown },
177 { 0x94, &IID_IFolderBandPriv },
178 }
179 },
180 {
181 ID_NAME(CLSID_MenuBand),
182 {
183 { -0x30, &IID_IDeskBand },
184 { -0x30, &IID_IDockingWindow },
185 { -0x30, &IID_IOleWindow },
186 { -0x2c, &IID_IObjectWithSite },
187 { -0x24, &IID_IInputObject },
188 { -0x20, &IID_IPersistStream },
189 { -0x20, &IID_IPersist },
190 { -0x1c, &IID_IOleCommandTarget },
191 { -0x18, &IID_IServiceProvider },
192 { 0x0, &IID_IMenuPopup },
193 { 0x0, &IID_IDeskBar },
194 { 0x0, &IID_IUnknown },
195 { 0x4, &IID_IMenuBand },
196 { 0x8, &IID_IShellMenu2 },
197 { 0x8, &IID_IShellMenu },
198 { 0xc, &IID_IWinEventHandler },
199 { 0x10, &IID_IShellMenuAcc },
200 }
201 },
202 {
203 ID_NAME(CLSID_MenuBandSite),
204 {
205 { 0x0, &IID_IBandSite },
206 { 0x0, &IID_IUnknown },
207 { 0x4, &IID_IDeskBarClient },
208 { 0x4, &IID_IOleWindow },
209 { 0x8, &IID_IOleCommandTarget },
210 { 0xc, &IID_IInputObject },
211 { 0x10, &IID_IInputObjectSite },
212 { 0x14, &IID_IWinEventHandler },
213 { 0x18, &IID_IServiceProvider },
214 }
215 },
216 {
217 ID_NAME(CLSID_MenuDeskBar),
218 {
219 { -0x48, &IID_IOleCommandTarget },
220 { -0x44, &IID_IServiceProvider },
221 { -0x40, &IID_IDeskBar },
222 { -0x40, &IID_IOleWindow },
223 { -0x3c, &IID_IInputObjectSite },
224 { -0x38, &IID_IInputObject },
225 { 0x0, &IID_IMenuPopup },
226 { 0x0, &IID_IUnknown },
227 { 0x4, &IID_IObjectWithSite },
228 { 0x8, &IID_IBanneredBar },
229 { 0xc, &IID_IInitializeObject },
230 }
231 },
232 #if 0 // This is registered to shell32, but can't be instanciated
233 {
234 ID_NAME(CLSID_MenuToolbarBase),
235 {
236 { 0x0, &IID_IUnknown },
237 }
238 },
239 #endif
240 {
241 ID_NAME(CLSID_MergedFolder),
242 {
243 { -0x8, &IID_IShellFolder2 },
244 { -0x4, &IID_IStorage },
245 { 0x0, &IID_IAugmentedShellFolder2 },
246 { 0x0, &IID_IAugmentedShellFolder },
247 { 0x0, &IID_IShellFolder },
248 { 0x0, &IID_IUnknown },
249 { 0x4, &IID_IShellService },
250 { 0x8, &IID_ITranslateShellChangeNotify },
251 { 0xc, &IID_IPersistFolder2 },
252 { 0xc, &IID_IPersistFolder },
253 { 0xc, &IID_IPersist },
254 { 0x10, &IID_IPersistPropertyBag },
255 { 0x14, &IID_IShellIconOverlay },
256 }
257 },
258 {
259 ID_NAME(CLSID_MoveToMenu),
260 {
261 { 0x0, &IID_IContextMenu3 },
262 { 0x0, &IID_IContextMenu2 },
263 { 0x0, &IID_IContextMenu },
264 { 0x0, &IID_IUnknown },
265 { 0x4, &IID_IShellExtInit },
266 { 0x8, &IID_IObjectWithSite },
267 { 0x10, &IID_IFolderFilter },
268 }
269 },
270 {
271 ID_NAME(CLSID_MyComputer),
272 {
273 { 0x0, &IID_IUnknown },
274 { 0x10, &IID_IPersistFolder2 },
275 { 0x10, &IID_IPersistFolder },
276 { 0x10, &IID_IPersist },
277 { FARAWY, &IID_IShellIconOverlay },
278 { FARAWY, &IID_IShellFolder2 },
279 { FARAWY, &IID_IShellFolder },
280 }
281 },
282 {
283 ID_NAME(CLSID_MyDocuments),
284 {
285 { -0x4, &IID_IPersistFolder },
286 { -0x4, &IID_IPersist },
287 { 0x0, &IID_IShellFolder2 },
288 { 0x0, &IID_IShellFolder },
289 { 0x0, &IID_IUnknown },
290 { 0x4, &IID_IShellIconOverlay },
291 { FARAWY, &IID_IShellIcon },
292 { FARAWY, &IID_IPersistFolder3 },
293 { FARAWY, &IID_IPersistFolder2 },
294 { FARAWY, &IID_IStorage },
295 { FARAWY, &IID_IContextMenuCB },
296 { FARAWY, &IID_IOleCommandTarget },
297 }
298 },
299 {
300 ID_NAME(CLSID_NetworkPlaces),
301 {
302 { 0x0, &IID_IUnknown },
303 { 0x10, &IID_IPersistFolder3 },
304 { 0x10, &IID_IPersistFolder2 },
305 { 0x10, &IID_IPersistFolder },
306 { 0x10, &IID_IPersist },
307 { FARAWY, &IID_IShellIconOverlay },
308 { FARAWY, &IID_IShellFolder2 },
309 { FARAWY, &IID_IShellFolder },
310 }
311 },
312 {
313 ID_NAME(CLSID_NewMenu),
314 {
315 { -0xc, &IID_IObjectWithSite },
316 { -0x4, &IID_IContextMenu3 },
317 { -0x4, &IID_IContextMenu2 },
318 { -0x4, &IID_IContextMenu },
319 { 0x0, &IID_IShellExtInit },
320 { 0x0, &IID_IUnknown },
321 }
322 },
323 {
324 ID_NAME(CLSID_PersonalStartMenu),
325 {
326 { -0x30, &IID_IDeskBand },
327 { -0x30, &IID_IDockingWindow },
328 { -0x30, &IID_IOleWindow },
329 { -0x2c, &IID_IObjectWithSite },
330 { -0x24, &IID_IInputObject },
331 { -0x20, &IID_IPersistStream },
332 { -0x20, &IID_IPersist },
333 { -0x1c, &IID_IOleCommandTarget },
334 { -0x18, &IID_IServiceProvider },
335 { 0x0, &IID_IMenuPopup },
336 { 0x0, &IID_IDeskBar },
337 { 0x0, &IID_IUnknown },
338 { 0x4, &IID_IMenuBand },
339 { 0x8, &IID_IShellMenu2 },
340 { 0x8, &IID_IShellMenu },
341 { 0xc, &IID_IWinEventHandler },
342 { 0x10, &IID_IShellMenuAcc },
343 }
344 },
345 {
346 ID_NAME(CLSID_Printers),
347 {
348 { -0xc, &IID_IRemoteComputer },
349 { 0x0, &IID_IShellFolder2 },
350 { 0x0, &IID_IShellFolder },
351 { 0x0, &IID_IUnknown },
352 { 0x4, &IID_IPersistFolder2 },
353 { 0x4, &IID_IPersistFolder },
354 { 0x4, &IID_IPersist },
355 { 0x8, &IID_IContextMenuCB },
356 { 0xc, &IID_IShellIconOverlay },
357 }
358 },
359 {
360 ID_NAME(CLSID_QueryAssociations),
361 {
362 { 0x0, &IID_IUnknown },
363 { 0x8, &IID_IQueryAssociations },
364 }
365 },
366 {
367 ID_NAME(CLSID_QuickLinks),
368 {
369 { -0xac, &IID_IDeskBand },
370 { -0xac, &IID_IDockingWindow },
371 { -0xac, &IID_IOleWindow },
372 { -0xa8, &IID_IObjectWithSite },
373 { -0xa0, &IID_IInputObject },
374 { -0x9c, &IID_IPersistStream },
375 { -0x9c, &IID_IPersist },
376 { -0x98, &IID_IOleCommandTarget },
377 { -0x94, &IID_IServiceProvider },
378 { -0x78, &IID_IWinEventHandler },
379 { -0x74, &IID_IShellChangeNotify },
380 { -0x70, &IID_IDropTarget },
381 { -0x4, &IID_IContextMenu },
382 { 0x0, &IID_IShellFolderBand },
383 { 0x0, &IID_IUnknown },
384 { 0x94, &IID_IFolderBandPriv },
385 }
386 },
387 {
388 ID_NAME(CLSID_RecycleBin),
389 {
390 { 0x0, &IID_IPersistFolder2 },
391 { 0x0, &IID_IPersistFolder },
392 //{ 0x0, &IID_IPersist },
393 { 0x0, &IID_IUnknown },
394 { 0x4, &IID_IShellFolder2 },
395 { 0x4, &IID_IShellFolder },
396 { 0x8, &IID_IContextMenu },
397 { 0xc, &IID_IShellPropSheetExt },
398 { 0x10, &IID_IShellExtInit },
399 }
400 },
401 {
402 ID_NAME(CLSID_SendToMenu),
403 {
404 { -0x4, &IID_IContextMenu3 },
405 { -0x4, &IID_IContextMenu2 },
406 { -0x4, &IID_IContextMenu },
407 { 0x0, &IID_IShellExtInit },
408 { 0x0, &IID_IUnknown },
409 { 0x4, &IID_IOleWindow },
410 }
411 },
412 {
413 ID_NAME(CLSID_Shell),
414 {
415 { 0x0, &IID_IShellDispatch4 },
416 { 0x0, &IID_IShellDispatch3 },
417 { 0x0, &IID_IShellDispatch2 },
418 { 0x0, &IID_IShellDispatch },
419 { 0x0, &IID_IDispatch },
420 { 0x0, &IID_IUnknown },
421 { 0x4, &IID_IObjectSafety },
422 { 0x20, &IID_IObjectWithSite },
423 }
424 },
425 {
426 ID_NAME(CLSID_ShellDesktop),
427 {
428 { -0x8, &CLSID_ShellDesktop },
429 { -0x8, &IID_IObjectWithSite },
430 { 0x0, &IID_IUnknown },
431 { 0x4, &IID_IStorage },
432 { 0x8, &IID_IPersistFolder2 },
433 { 0x8, &IID_IPersistFolder },
434 { 0x8, &IID_IPersist },
435 { 0xc, &IID_IShellIcon },
436 { 0x14, &IID_IContextMenuCB },
437 { 0x18, &IID_ITranslateShellChangeNotify },
438 { 0x20, &IID_IOleCommandTarget },
439 { FARAWY, &IID_IShellIconOverlay },
440 { FARAWY, &IID_IShellFolder2 },
441 { FARAWY, &IID_IShellFolder },
442 }
443 },
444 {
445 ID_NAME(CLSID_ShellFSFolder),
446 {
447 { 0x0, &IID_IUnknown },
448 { 0xc, &IID_IShellFolder2 },
449 { 0xc, &IID_IShellFolder },
450 { 0x10, &IID_IShellIcon },
451 { 0x14, &IID_IShellIconOverlay },
452 { 0x18, &IID_IPersistFolder3 },
453 { 0x18, &IID_IPersistFolder2 },
454 { 0x18, &IID_IPersistFolder },
455 { 0x18, &IID_IPersist },
456 { 0x1c, &IID_IStorage },
457 { 0x2c, &IID_IContextMenuCB },
458 { 0x34, &IID_IOleCommandTarget },
459 }
460 },
461 {
462 ID_NAME(CLSID_ShellFldSetExt),
463 {
464 { 0x0, &IID_IShellPropSheetExt },
465 { 0x0, &IID_IUnknown },
466 { 0x4, &IID_IShellExtInit },
467 { 0x8, &IID_IObjectWithSite },
468 }
469 },
470 {
471 ID_NAME(CLSID_ShellFolderView),
472 {
473 { 0x0, &IID_IShellFolderViewDual2 },
474 { 0x0, &IID_IShellFolderViewDual },
475 { 0x0, &IID_IDispatch },
476 { 0x0, &IID_IUnknown },
477 { 0x4, &IID_IShellService },
478 { 0x8, &IID_IServiceProvider },
479 { 0xc, &IID_IObjectSafety },
480 { 0x14, &IID_IObjectWithSite },
481 }
482 },
483 {
484 ID_NAME(CLSID_ShellFolderViewOC),
485 {
486 { 0x0, &IID_IFolderViewOC },
487 { 0x0, &IID_IDispatch },
488 { 0x0, &IID_IUnknown },
489 { 0x8, &IID_IObjectSafety },
490 { 0x88, &IID_IPersistStreamInit },
491 { 0x88, &IID_IPersist },
492 { 0x90, &IID_IOleObject },
493 { 0x94, &IID_IOleInPlaceActiveObject },
494 { 0x98, &IID_IOleInPlaceObjectWindowless },
495 { 0x98, &IID_IOleInPlaceObject },
496 { 0x98, &IID_IOleWindow },
497 }
498 },
499 {
500 ID_NAME(CLSID_ShellItem),
501 {
502 { 0x0, &IID_IShellItem },
503 { 0x0, &IID_IUnknown },
504 { 0x4, &IID_IPersistIDList },
505 }
506 },
507 {
508 ID_NAME(CLSID_ShellLink),
509 {
510 { 0x0, &IID_IShellLinkA },
511 { 0x0, &IID_IUnknown },
512 { 0x4, &IID_IShellLinkW },
513 { 0x8, &IID_IPersistStream },
514 { 0xc, &IID_IPersistFile },
515 { 0x10, &IID_IShellExtInit },
516 { 0x14, &IID_IContextMenu3 },
517 { 0x14, &IID_IContextMenu2 },
518 { 0x14, &IID_IContextMenu },
519 { 0x18, &IID_IDropTarget },
520 { 0x1c, &IID_IQueryInfo },
521 { 0x20, &IID_IShellLinkDataList },
522 { 0x24, &IID_IExtractIconA },
523 { 0x28, &IID_IExtractIconW },
524 { 0x2c, &IID_IExtractImage2 },
525 { 0x2c, &IID_IExtractImage },
526 { 0x30, &IID_IPersistPropertyBag },
527 { 0x34, &IID_IServiceProvider },
528 { 0x3c, &IID_IObjectWithSite },
529 }
530 },
531 #if 0 // Apparently we can only get this through Folder.Items().GetLink
532 {
533 ID_NAME(CLSID_ShellLinkObject),
534 {
535 { 0x0, &IID_IUnknown },
536 }
537 },
538 #endif
539 {
540 ID_NAME(CLSID_StartMenu),
541 {
542 { -0x48, &IID_IOleCommandTarget },
543 { -0x44, &IID_IServiceProvider },
544 { -0x40, &IID_IDeskBar },
545 { -0x40, &IID_IOleWindow },
546 { -0x3c, &IID_IInputObjectSite },
547 { -0x38, &IID_IInputObject },
548 { 0x0, &IID_IMenuPopup },
549 { 0x0, &IID_IUnknown },
550 { 0x4, &IID_IObjectWithSite },
551 { 0x8, &IID_IBanneredBar },
552 { 0xc, &IID_IInitializeObject },
553 }
554 },
555 {
556 ID_NAME(CLSID_StartMenuPin),
557 {
558 { 0x0, &IID_IShellExtInit },
559 { 0x0, &IID_IUnknown },
560 { 0x4, &IID_IContextMenu },
561 { 0xc, &IID_IObjectWithSite },
562 }
563 },
564 {
565 ID_NAME(CLSID_TrackShellMenu),
566 {
567 { 0x0, &IID_ITrackShellMenu },
568 { 0x0, &IID_IShellMenu },
569 { 0x0, &IID_IUnknown },
570 { 0x4, &IID_IShellMenu2 },
571 { 0x8, &IID_IObjectWithSite },
572 { 0xc, &IID_IServiceProvider },
573 }
574 },
575 };
576 static const INT ExpectedInterfaceCount = RTL_NUMBER_OF(ExpectedInterfaces);
577
578 START_TEST(shell32)
579 {
580 TestClasses(L"shell32", ExpectedInterfaces, ExpectedInterfaceCount);
581 }