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