1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         LGPLv2.1+ - See COPYING.LIB in the top level directory
4  * PURPOSE:         Test for CMyComputer
5  * PROGRAMMER:      Thomas Faber <thomas.faber@reactos.org>
6  */
7 
8 #include "shelltest.h"
9 
10 #define NDEBUG
11 #include <debug.h>
12 #include <shellutils.h>
13 
14 #define INVALID_POINTER ((PVOID)(ULONG_PTR)0xdeadbeefdeadbeefULL)
15 
16 static
17 VOID
18 TestShellFolder(
19     _In_ IShellFolder2 *psf2)
20 {
21     HRESULT hr;
22     CComPtr<IDropTarget> pdt;
23     CComPtr<IDropTarget> pdt_2;
24     CComPtr<IContextMenu> pcm;
25     CComPtr<IContextMenu> pcm_2;
26     CComPtr<IShellView> psv;
27     CComPtr<IShellView> psv_2;
28 
29     hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt));
30     ok(hr == S_OK, "hr = %lx\n", hr);
31 
32     hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt_2));
33     ok(hr == S_OK, "hr = %lx\n", hr);
34     ok(pdt != pdt_2, "Expected %p != %p\n", static_cast<PVOID>(pdt), static_cast<PVOID>(pdt_2));
35 
36     hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm));
37     ok(hr == S_OK, "hr = %lx\n", hr);
38 
39     hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm_2));
40     ok(hr == S_OK, "hr = %lx\n", hr);
41     ok(pcm != pcm_2, "Expected %p != %p\n", static_cast<PVOID>(pcm), static_cast<PVOID>(pcm_2));
42 
43     hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv));
44     ok(hr == S_OK, "hr = %lx\n", hr);
45 
46     hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv_2));
47     ok(hr == S_OK, "hr = %lx\n", hr);
48     ok(psv != psv_2, "Expected %p != %p\n", static_cast<PVOID>(psv), static_cast<PVOID>(psv_2));
49 }
50 
51 VOID TestInitialize(_In_ IShellFolder2 *psf2)
52 {
53     CComPtr<IPersistFolder2> ppf2;
54     HRESULT hr = psf2->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
55     ok(hr == S_OK, "hr = %lx\n", hr);
56 
57     hr = ppf2->Initialize(NULL);
58     ok(hr == S_OK, "hr = %lx\n", hr);
59 
60     hr = ppf2->Initialize((LPCITEMIDLIST)INVALID_POINTER);
61     ok(hr == S_OK, "hr = %lx\n", hr);
62 
63     //crashes in xp
64     //hr = ppf2->GetCurFolder(NULL);
65     //ok(hr == E_INVALIDARG, "hr = %lx\n", hr);
66 
67     LPITEMIDLIST pidl;
68     hr = ppf2->GetCurFolder(&pidl);
69     ok(hr == S_OK, "hr = %lx\n", hr);
70     // 0 in win10, 14 in xp
71     ok(pidl->mkid.cb == 0x14, "expected empty pidl got cb = %x\n", pidl->mkid.cb);
72 }
73 
74 START_TEST(CMyComputer)
75 {
76     HRESULT hr;
77     CComPtr<IShellFolder2> psf2;
78     CComPtr<IShellFolder2> psf2_2;
79     CComPtr<IShellFolder> psf;
80 
81     CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
82 
83     hr = CoCreateInstance(CLSID_MyComputer,
84                           NULL,
85                           CLSCTX_INPROC_SERVER,
86                           IID_PPV_ARG(IShellFolder2, &psf2));
87     ok(hr == S_OK, "hr = %lx\n", hr);
88     if (FAILED(hr))
89     {
90         skip("Could not instantiate CShellDesktop\n");
91         return;
92     }
93 
94     /* second create should give us a pointer to the same object */
95     hr = CoCreateInstance(CLSID_MyComputer,
96                           NULL,
97                           CLSCTX_INPROC_SERVER,
98                           IID_PPV_ARG(IShellFolder2, &psf2_2));
99     ok(hr == S_OK, "hr = %lx\n", hr);
100     ok(psf2 == psf2_2, "Expected %p == %p\n", static_cast<PVOID>(psf2), static_cast<PVOID>(psf2_2));
101 
102     TestShellFolder(psf2);
103     TestInitialize(psf2);
104 }
105