[IPHLPAPI_APITEST]
[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 { 0x10, &IID_IPersistFreeThreadedObject },
278 { FARAWY, &IID_IShellIconOverlay },
279 { FARAWY, &IID_IShellFolder2 },
280 { FARAWY, &IID_IShellFolder },
281 }
282 },
283 {
284 ID_NAME(CLSID_MyDocuments),
285 {
286 { -0x4, &IID_IPersistFolder },
287 { -0x4, &IID_IPersist },
288 { 0x0, &IID_IShellFolder2 },
289 { 0x0, &IID_IShellFolder },
290 { 0x0, &IID_IUnknown },
291 { 0x4, &IID_IShellIconOverlay },
292 { FARAWY, &IID_IShellIcon },
293 { FARAWY, &IID_IPersistFolder3 },
294 { FARAWY, &IID_IPersistFolder2 },
295 { FARAWY, &IID_IStorage },
296 { FARAWY, &IID_IContextMenuCB },
297 { FARAWY, &IID_IOleCommandTarget },
298 }
299 },
300 {
301 ID_NAME(CLSID_NetworkPlaces),
302 {
303 { 0x0, &IID_IUnknown },
304 { 0x10, &IID_IPersistFolder3 },
305 { 0x10, &IID_IPersistFolder2 },
306 { 0x10, &IID_IPersistFolder },
307 { 0x10, &IID_IPersist },
308 { 0x10, &IID_IPersistFreeThreadedObject },
309 { FARAWY, &IID_IShellIconOverlay },
310 { FARAWY, &IID_IShellFolder2 },
311 { FARAWY, &IID_IShellFolder },
312 }
313 },
314 {
315 ID_NAME(CLSID_NewMenu),
316 {
317 { -0xc, &IID_IObjectWithSite },
318 { -0x4, &IID_IContextMenu3 },
319 { -0x4, &IID_IContextMenu2 },
320 { -0x4, &IID_IContextMenu },
321 { 0x0, &IID_IShellExtInit },
322 { 0x0, &IID_IUnknown },
323 }
324 },
325 {
326 ID_NAME(CLSID_PersonalStartMenu),
327 {
328 { -0x30, &IID_IDeskBand },
329 { -0x30, &IID_IDockingWindow },
330 { -0x30, &IID_IOleWindow },
331 { -0x2c, &IID_IObjectWithSite },
332 { -0x24, &IID_IInputObject },
333 { -0x20, &IID_IPersistStream },
334 { -0x20, &IID_IPersist },
335 { -0x1c, &IID_IOleCommandTarget },
336 { -0x18, &IID_IServiceProvider },
337 { 0x0, &IID_IMenuPopup },
338 { 0x0, &IID_IDeskBar },
339 { 0x0, &IID_IUnknown },
340 { 0x4, &IID_IMenuBand },
341 { 0x8, &IID_IShellMenu2 },
342 { 0x8, &IID_IShellMenu },
343 { 0xc, &IID_IWinEventHandler },
344 { 0x10, &IID_IShellMenuAcc },
345 }
346 },
347 {
348 ID_NAME(CLSID_Printers),
349 {
350 { -0xc, &IID_IRemoteComputer },
351 { 0x0, &IID_IShellFolder2 },
352 { 0x0, &IID_IShellFolder },
353 { 0x0, &IID_IUnknown },
354 { 0x4, &IID_IPersistFolder2 },
355 { 0x4, &IID_IPersistFolder },
356 { 0x4, &IID_IPersist },
357 { 0x8, &IID_IContextMenuCB },
358 { 0xc, &IID_IShellIconOverlay },
359 }
360 },
361 {
362 ID_NAME(CLSID_QueryAssociations),
363 {
364 { 0x0, &IID_IUnknown },
365 { 0x8, &IID_IQueryAssociations },
366 }
367 },
368 {
369 ID_NAME(CLSID_QuickLinks),
370 {
371 { -0xac, &IID_IDeskBand },
372 { -0xac, &IID_IDockingWindow },
373 { -0xac, &IID_IOleWindow },
374 { -0xa8, &IID_IObjectWithSite },
375 { -0xa0, &IID_IInputObject },
376 { -0x9c, &IID_IPersistStream },
377 { -0x9c, &IID_IPersist },
378 { -0x98, &IID_IOleCommandTarget },
379 { -0x94, &IID_IServiceProvider },
380 { -0x78, &IID_IWinEventHandler },
381 { -0x74, &IID_IShellChangeNotify },
382 { -0x70, &IID_IDropTarget },
383 { -0x4, &IID_IContextMenu },
384 { 0x0, &IID_IShellFolderBand },
385 { 0x0, &IID_IUnknown },
386 { 0x94, &IID_IFolderBandPriv },
387 }
388 },
389 {
390 ID_NAME(CLSID_RecycleBin),
391 {
392 { 0x0, &IID_IPersistFolder2 },
393 { 0x0, &IID_IPersistFolder },
394 //{ 0x0, &IID_IPersist },
395 { 0x0, &IID_IUnknown },
396 { 0x4, &IID_IShellFolder2 },
397 { 0x4, &IID_IShellFolder },
398 { 0x8, &IID_IContextMenu },
399 { 0xc, &IID_IShellPropSheetExt },
400 { 0x10, &IID_IShellExtInit },
401 }
402 },
403 {
404 ID_NAME(CLSID_SendToMenu),
405 {
406 { -0x4, &IID_IContextMenu3 },
407 { -0x4, &IID_IContextMenu2 },
408 { -0x4, &IID_IContextMenu },
409 { 0x0, &IID_IShellExtInit },
410 { 0x0, &IID_IUnknown },
411 { 0x4, &IID_IOleWindow },
412 }
413 },
414 {
415 ID_NAME(CLSID_Shell),
416 {
417 { 0x0, &IID_IShellDispatch4 },
418 { 0x0, &IID_IShellDispatch3 },
419 { 0x0, &IID_IShellDispatch2 },
420 { 0x0, &IID_IShellDispatch },
421 { 0x0, &IID_IDispatch },
422 { 0x0, &IID_IUnknown },
423 { 0x4, &IID_IObjectSafety },
424 { 0x20, &IID_IObjectWithSite },
425 }
426 },
427 {
428 ID_NAME(CLSID_ShellDesktop),
429 {
430 { -0x8, &CLSID_ShellDesktop },
431 { -0x8, &IID_IObjectWithSite },
432 { 0x0, &IID_IUnknown },
433 { 0x4, &IID_IStorage },
434 { 0x8, &IID_IPersistFolder2 },
435 { 0x8, &IID_IPersistFolder },
436 { 0x8, &IID_IPersist },
437 { 0xc, &IID_IShellIcon },
438 { 0x14, &IID_IContextMenuCB },
439 { 0x18, &IID_ITranslateShellChangeNotify },
440 { 0x20, &IID_IOleCommandTarget },
441 { FARAWY, &IID_IShellIconOverlay },
442 { FARAWY, &IID_IShellFolder2 },
443 { FARAWY, &IID_IShellFolder },
444 }
445 },
446 {
447 ID_NAME(CLSID_ShellFSFolder),
448 {
449 { 0x0, &IID_IUnknown },
450 { 0xc, &IID_IShellFolder2 },
451 { 0xc, &IID_IShellFolder },
452 { 0x10, &IID_IShellIcon },
453 { 0x14, &IID_IShellIconOverlay },
454 { 0x18, &IID_IPersistFolder3 },
455 { 0x18, &IID_IPersistFolder2 },
456 { 0x18, &IID_IPersistFolder },
457 { 0x18, &IID_IPersist },
458 { 0x18, &IID_IPersistFreeThreadedObject },
459 { 0x1c, &IID_IStorage },
460 { 0x2c, &IID_IContextMenuCB },
461 { 0x34, &IID_IOleCommandTarget },
462 }
463 },
464 {
465 ID_NAME(CLSID_ShellFldSetExt),
466 {
467 { 0x0, &IID_IShellPropSheetExt },
468 { 0x0, &IID_IUnknown },
469 { 0x4, &IID_IShellExtInit },
470 { 0x8, &IID_IObjectWithSite },
471 }
472 },
473 {
474 ID_NAME(CLSID_ShellFolderView),
475 {
476 { 0x0, &IID_IShellFolderViewDual2 },
477 { 0x0, &IID_IShellFolderViewDual },
478 { 0x0, &IID_IDispatch },
479 { 0x0, &IID_IUnknown },
480 { 0x4, &IID_IShellService },
481 { 0x8, &IID_IServiceProvider },
482 { 0xc, &IID_IObjectSafety },
483 { 0x14, &IID_IObjectWithSite },
484 }
485 },
486 {
487 ID_NAME(CLSID_ShellFolderViewOC),
488 {
489 { 0x0, &IID_IFolderViewOC },
490 { 0x0, &IID_IDispatch },
491 { 0x0, &IID_IUnknown },
492 { 0x8, &IID_IObjectSafety },
493 { 0x88, &IID_IPersistStreamInit },
494 { 0x88, &IID_IPersist },
495 { 0x90, &IID_IOleObject },
496 { 0x94, &IID_IOleInPlaceActiveObject },
497 { 0x98, &IID_IOleInPlaceObjectWindowless },
498 { 0x98, &IID_IOleInPlaceObject },
499 { 0x98, &IID_IOleWindow },
500 }
501 },
502 {
503 ID_NAME(CLSID_ShellItem),
504 {
505 { 0x0, &IID_IShellItem },
506 { 0x0, &IID_IUnknown },
507 { 0x4, &IID_IPersistIDList },
508 }
509 },
510 {
511 ID_NAME(CLSID_ShellLink),
512 {
513 { 0x0, &IID_IShellLinkA },
514 { 0x0, &IID_IUnknown },
515 { 0x4, &IID_IShellLinkW },
516 { 0x8, &IID_IPersistStream },
517 { 0xc, &IID_IPersistFile },
518 { 0x10, &IID_IShellExtInit },
519 { 0x14, &IID_IContextMenu3 },
520 { 0x14, &IID_IContextMenu2 },
521 { 0x14, &IID_IContextMenu },
522 { 0x18, &IID_IDropTarget },
523 { 0x1c, &IID_IQueryInfo },
524 { 0x20, &IID_IShellLinkDataList },
525 { 0x24, &IID_IExtractIconA },
526 { 0x28, &IID_IExtractIconW },
527 { 0x2c, &IID_IExtractImage2 },
528 { 0x2c, &IID_IExtractImage },
529 { 0x30, &IID_IPersistPropertyBag },
530 { 0x34, &IID_IServiceProvider },
531 { 0x3c, &IID_IObjectWithSite },
532 }
533 },
534 #if 0 // Apparently we can only get this through Folder.Items().GetLink
535 {
536 ID_NAME(CLSID_ShellLinkObject),
537 {
538 { 0x0, &IID_IUnknown },
539 }
540 },
541 #endif
542 {
543 ID_NAME(CLSID_StartMenu),
544 {
545 { -0x48, &IID_IOleCommandTarget },
546 { -0x44, &IID_IServiceProvider },
547 { -0x40, &IID_IDeskBar },
548 { -0x40, &IID_IOleWindow },
549 { -0x3c, &IID_IInputObjectSite },
550 { -0x38, &IID_IInputObject },
551 { 0x0, &IID_IMenuPopup },
552 { 0x0, &IID_IUnknown },
553 { 0x4, &IID_IObjectWithSite },
554 { 0x8, &IID_IBanneredBar },
555 { 0xc, &IID_IInitializeObject },
556 }
557 },
558 {
559 ID_NAME(CLSID_StartMenuPin),
560 {
561 { 0x0, &IID_IShellExtInit },
562 { 0x0, &IID_IUnknown },
563 { 0x4, &IID_IContextMenu },
564 { 0xc, &IID_IObjectWithSite },
565 }
566 },
567 {
568 ID_NAME(CLSID_TrackShellMenu),
569 {
570 { 0x0, &IID_ITrackShellMenu },
571 { 0x0, &IID_IShellMenu },
572 { 0x0, &IID_IUnknown },
573 { 0x4, &IID_IShellMenu2 },
574 { 0x8, &IID_IObjectWithSite },
575 { 0xc, &IID_IServiceProvider },
576 }
577 },
578 };
579 static const INT ExpectedInterfaceCount = RTL_NUMBER_OF(ExpectedInterfaces);
580
581 START_TEST(shell32)
582 {
583 TestClasses(L"shell32", ExpectedInterfaces, ExpectedInterfaceCount);
584 }