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: Giannis Adamopoulos 6 */ 7 8 #include "shelltest.h" 9 10 #define NDEBUG 11 #include <debug.h> 12 #include <stdio.h> 13 #include <shellutils.h> 14 #include <versionhelpers.h> 15 16 LPITEMIDLIST _CreateDummyPidl() 17 { 18 /* Create a tiny pidl with no contents */ 19 LPITEMIDLIST testpidl = (LPITEMIDLIST)SHAlloc(3 * sizeof(WORD)); 20 testpidl->mkid.cb = 2 * sizeof(WORD); 21 *(WORD*)((char*)testpidl + (int)(2 * sizeof(WORD))) = 0; 22 23 return testpidl; 24 } 25 26 VOID TestUninitialized() 27 { 28 CComPtr<IShellFolder> psf; 29 CComPtr<IEnumIDList> penum; 30 CComPtr<IDropTarget> pdt; 31 CComPtr<IContextMenu> pcm; 32 CComPtr<IShellView> psv; 33 LPITEMIDLIST retrievedPidl; 34 ULONG pceltFetched; 35 HRESULT hr; 36 37 /* Create a CFSFolder */ 38 hr = CoCreateInstance(CLSID_ShellFSFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellFolder, &psf)); 39 ok(hr == S_OK, "hr = %lx\n", hr); 40 41 /* An uninitialized CFSFolder doesn't contain any items */ 42 hr = psf->EnumObjects(NULL, 0, &penum); 43 ok(hr == S_OK, "hr = %lx\n", hr); 44 hr = penum->Next(0, &retrievedPidl, &pceltFetched); 45 ok(hr == S_FALSE, "hr = %lx\n", hr); 46 hr = penum->Next(1, &retrievedPidl, &pceltFetched); 47 ok(hr == S_FALSE, "hr = %lx\n", hr); 48 49 /* It supports viewing */ 50 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt)); 51 ok(hr == S_OK, "hr = %lx\n", hr); 52 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm)); 53 ok(hr == S_OK, "hr = %lx\n", hr); 54 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv)); 55 ok(hr == S_OK, "hr = %lx\n", hr); 56 57 /* And its display name is ... "C:\Documents and Settings\<username>\Desktop" */ 58 STRRET strretName; 59 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 60 ok(hr == S_OK, "hr = %lx\n", hr); 61 ok(strretName.uType == STRRET_WSTR, "strretName.uType == %x\n", strretName.uType); 62 ok((wcsncmp(strretName.pOleStr, L"C:\\Documents and Settings\\", 26) == 0) || 63 (wcsncmp(strretName.pOleStr, L"C:\\Users\\", 9) == 0), 64 "wrong name, got: %S\n", strretName.pOleStr); 65 ok(wcscmp(strretName.pOleStr + wcslen(strretName.pOleStr) - 8, L"\\Desktop") == NULL, 66 "wrong name, got: %S\n", strretName.pOleStr); 67 68 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING|SHGDN_INFOLDER,&strretName); 69 ok(hr == E_INVALIDARG, "hr = %lx\n", hr); 70 71 72 73 74 /* Use Initialize method with a dummy pidl and test the still non initialized CFSFolder */ 75 CComPtr<IPersistFolder2> ppf2; 76 hr = psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); 77 ok(hr == S_OK, "hr = %lx\n", hr); 78 79 LPITEMIDLIST testpidl = _CreateDummyPidl(); 80 81 hr = ppf2->Initialize(testpidl); 82 ok(hr == S_OK, "hr = %lx\n", hr); 83 84 CComHeapPtr<ITEMIDLIST> pidl; 85 hr = ppf2->GetCurFolder(&pidl); 86 ok(hr == S_OK, "hr = %lx\n", hr); 87 ok(pidl->mkid.cb == 2 * sizeof(WORD), "got wrong pidl size, cb = %x\n", pidl->mkid.cb); 88 89 /* methods that worked before, now fail */ 90 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 91 ok(hr == (IsWindows7OrGreater() ? E_INVALIDARG : E_FAIL), "hr = %lx\n", hr); 92 hr = psf->EnumObjects(NULL, 0, &penum); 93 ok(hr == (IsWindows7OrGreater() ? E_INVALIDARG : HRESULT_FROM_WIN32(ERROR_CANCELLED)), "hr = %lx\n", hr); 94 95 /* The following continue to work though */ 96 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt)); 97 ok(hr == S_OK, "hr = %lx\n", hr); 98 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm)); 99 ok(hr == S_OK, "hr = %lx\n", hr); 100 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv)); 101 ok(hr == S_OK, "hr = %lx\n", hr); 102 103 } 104 105 VOID TestInitialize() 106 { 107 HRESULT hr; 108 STRRET strretName; 109 110 /* Create a CFSFolder */ 111 CComPtr<IShellFolder> psf; 112 hr = CoCreateInstance(CLSID_ShellFSFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellFolder, &psf)); 113 ok(hr == S_OK, "hr = %lx\n", hr); 114 115 CComPtr<IPersistFolder3> ppf3; 116 hr = psf->QueryInterface(IID_PPV_ARG(IPersistFolder3, &ppf3)); 117 ok(hr == S_OK, "hr = %lx\n", hr); 118 119 LPITEMIDLIST testpidl = _CreateDummyPidl(); 120 PERSIST_FOLDER_TARGET_INFO pfti = {0}; 121 PERSIST_FOLDER_TARGET_INFO queriedPfti; 122 hr = ppf3->InitializeEx(NULL, NULL, NULL); 123 ok(hr == (IsWindows7OrGreater() ? E_INVALIDARG : E_OUTOFMEMORY), "hr = %lx\n", hr); 124 125 hr = ppf3->InitializeEx(NULL, NULL, &pfti); 126 ok(hr == (IsWindows7OrGreater() ? E_INVALIDARG : E_OUTOFMEMORY), "hr = %lx\n", hr); 127 128 wcscpy(pfti.szTargetParsingName, L"C:\\"); 129 hr = ppf3->InitializeEx(NULL, NULL, &pfti); 130 ok(hr == (IsWindows7OrGreater() ? E_INVALIDARG : E_OUTOFMEMORY), "hr = %lx\n", hr); 131 132 hr = ppf3->InitializeEx(NULL, testpidl, NULL); 133 ok(hr == S_OK, "hr = %lx\n", hr); 134 135 hr = ppf3->GetFolderTargetInfo(&queriedPfti); 136 ok(hr == (IsWindows7OrGreater() ? E_FAIL : S_OK), "hr = %lx\n", hr); 137 138 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 139 ok(hr == (IsWindows7OrGreater() ? E_INVALIDARG : E_FAIL), "hr = %lx\n", hr); 140 141 pfti.szTargetParsingName[0] = 0; 142 hr = ppf3->InitializeEx(NULL, testpidl, &pfti); 143 ok(hr == S_OK, "hr = %lx\n", hr); 144 145 hr = ppf3->GetFolderTargetInfo(&queriedPfti); 146 ok(hr == S_OK, "hr = %lx\n", hr); 147 ok(wcscmp(queriedPfti.szTargetParsingName, L"") == 0, "wrong name, got: %S\n", queriedPfti.szTargetParsingName); 148 149 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 150 ok(hr == (IsWindows7OrGreater() ? E_INVALIDARG : E_FAIL), "hr = %lx\n", hr); 151 152 wcscpy(pfti.szTargetParsingName, L"C:\\"); 153 hr = ppf3->InitializeEx(NULL, testpidl, &pfti); 154 ok(hr == S_OK, "hr = %lx\n", hr); 155 156 hr = ppf3->GetFolderTargetInfo(&queriedPfti); 157 ok(hr == S_OK, "hr = %lx\n", hr); 158 ok(wcscmp(queriedPfti.szTargetParsingName, L"C:\\") == 0, "wrong name, got: %S\n", queriedPfti.szTargetParsingName); 159 160 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 161 ok(hr == S_OK, "hr = %lx\n", hr); 162 ok(strretName.uType == STRRET_WSTR, "strretName.uType == %x\n", strretName.uType); 163 ok(wcscmp(strretName.pOleStr, L"C:\\") == 0, "wrong name, got: %S\n", strretName.pOleStr); 164 } 165 166 VOID TestGetUIObjectOf() 167 { 168 HRESULT hr; 169 170 /* Create a CFSFolder */ 171 CComPtr<IShellFolder> psf; 172 hr = CoCreateInstance(CLSID_ShellFSFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellFolder, &psf)); 173 ok(hr == S_OK, "hr = %lx\n", hr); 174 175 /* test 0 cidl for IDataObject */ 176 CComPtr<IDataObject> pdo; 177 hr = psf->GetUIObjectOf(NULL, 0, NULL, IID_NULL_PPV_ARG(IDataObject, &pdo)); 178 ok(hr == E_INVALIDARG, "hr = %lx\n", hr); 179 } 180 181 START_TEST(CFSFolder) 182 { 183 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 184 185 TestUninitialized(); 186 TestInitialize(); 187 TestGetUIObjectOf(); 188 }