Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenshlfolder.cpp
Go to the documentation of this file.
00001 /* 00002 * Shell Folder stuff 00003 * 00004 * Copyright 1997 Marcus Meissner 00005 * Copyright 1998, 1999, 2002 Juergen Schmied 00006 * 00007 * IShellFolder2 and related interfaces 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 * This library is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 * Lesser General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU Lesser General Public 00020 * License along with this library; if not, write to the Free Software 00021 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00022 */ 00023 00024 #include <precomp.h> 00025 00026 WINE_DEFAULT_DEBUG_CHANNEL(shell); 00027 00028 static const WCHAR wszDotShellClassInfo[] = { 00029 '.','S','h','e','l','l','C','l','a','s','s','I','n','f','o',0}; 00030 00031 /*************************************************************************** 00032 * SHELL32_GetCustomFolderAttribute (internal function) 00033 * 00034 * Gets a value from the folder's desktop.ini file, if one exists. 00035 * 00036 * PARAMETERS 00037 * pidl [I] Folder containing the desktop.ini file. 00038 * pwszHeading [I] Heading in .ini file. 00039 * pwszAttribute [I] Attribute in .ini file. 00040 * pwszValue [O] Buffer to store value into. 00041 * cchValue [I] Size in characters including NULL of buffer pointed to 00042 * by pwszValue. 00043 * 00044 * RETURNS 00045 * TRUE if returned non-NULL value. 00046 * FALSE otherwise. 00047 */ 00048 static BOOL __inline SHELL32_GetCustomFolderAttributeFromPath( 00049 LPWSTR pwszFolderPath, LPCWSTR pwszHeading, LPCWSTR pwszAttribute, 00050 LPWSTR pwszValue, DWORD cchValue) 00051 { 00052 static const WCHAR wszDesktopIni[] = 00053 {'d','e','s','k','t','o','p','.','i','n','i',0}; 00054 static const WCHAR wszDefault[] = {0}; 00055 00056 PathAddBackslashW(pwszFolderPath); 00057 PathAppendW(pwszFolderPath, wszDesktopIni); 00058 return GetPrivateProfileStringW(pwszHeading, pwszAttribute, wszDefault, 00059 pwszValue, cchValue, pwszFolderPath); 00060 } 00061 00062 BOOL SHELL32_GetCustomFolderAttribute( 00063 LPCITEMIDLIST pidl, LPCWSTR pwszHeading, LPCWSTR pwszAttribute, 00064 LPWSTR pwszValue, DWORD cchValue) 00065 { 00066 DWORD dwAttrib = FILE_ATTRIBUTE_SYSTEM; 00067 WCHAR wszFolderPath[MAX_PATH]; 00068 00069 /* Hack around not having system attribute on non-Windows file systems */ 00070 if (0) 00071 dwAttrib = _ILGetFileAttributes(pidl, NULL, 0); 00072 00073 if (dwAttrib & FILE_ATTRIBUTE_SYSTEM) 00074 { 00075 if (!SHGetPathFromIDListW(pidl, wszFolderPath)) 00076 return FALSE; 00077 00078 return SHELL32_GetCustomFolderAttributeFromPath(wszFolderPath, pwszHeading, 00079 pwszAttribute, pwszValue, cchValue); 00080 } 00081 return FALSE; 00082 } 00083 00084 /*************************************************************************** 00085 * GetNextElement (internal function) 00086 * 00087 * Gets a part of a string till the first backslash. 00088 * 00089 * PARAMETERS 00090 * pszNext [IN] string to get the element from 00091 * pszOut [IN] pointer to buffer which receives string 00092 * dwOut [IN] length of pszOut 00093 * 00094 * RETURNS 00095 * LPSTR pointer to first, not yet parsed char 00096 */ 00097 00098 LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut) 00099 { 00100 LPCWSTR pszTail = pszNext; 00101 DWORD dwCopy; 00102 00103 TRACE ("(%s %p 0x%08x)\n", debugstr_w (pszNext), pszOut, dwOut); 00104 00105 *pszOut = 0x0000; 00106 00107 if (!pszNext || !*pszNext) 00108 return NULL; 00109 00110 while (*pszTail && (*pszTail != (WCHAR) '\\')) 00111 pszTail++; 00112 00113 dwCopy = pszTail - pszNext + 1; 00114 lstrcpynW (pszOut, pszNext, (dwOut < dwCopy) ? dwOut : dwCopy); 00115 00116 if (*pszTail) 00117 pszTail++; 00118 else 00119 pszTail = NULL; 00120 00121 TRACE ("--(%s %s 0x%08x %p)\n", debugstr_w (pszNext), debugstr_w (pszOut), dwOut, pszTail); 00122 return pszTail; 00123 } 00124 00125 HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, 00126 LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes) 00127 { 00128 HRESULT hr = E_INVALIDARG; 00129 LPITEMIDLIST pidlOut = NULL, 00130 pidlTemp = NULL; 00131 IShellFolder *psfChild; 00132 00133 TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlInOut ? *pidlInOut : NULL, debugstr_w (szNext)); 00134 00135 /* get the shellfolder for the child pidl and let it analyse further */ 00136 hr = psf->BindToObject(*pidlInOut, pbc, IID_IShellFolder, (LPVOID *)&psfChild); 00137 00138 if (SUCCEEDED(hr)) { 00139 hr = psfChild->ParseDisplayName(hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes); 00140 psfChild->Release(); 00141 00142 if (SUCCEEDED(hr)) { 00143 pidlTemp = ILCombine (*pidlInOut, pidlOut); 00144 00145 if (!pidlTemp) 00146 hr = E_OUTOFMEMORY; 00147 } 00148 00149 if (pidlOut) 00150 ILFree (pidlOut); 00151 } 00152 00153 ILFree (*pidlInOut); 00154 *pidlInOut = pidlTemp; 00155 00156 TRACE ("-- pidl=%p ret=0x%08x\n", pidlInOut ? *pidlInOut : NULL, hr); 00157 return hr; 00158 } 00159 00160 /*********************************************************************** 00161 * SHELL32_CoCreateInitSF 00162 * 00163 * Creates a shell folder and initializes it with a pidl and a root folder 00164 * via IPersistFolder3 or IPersistFolder. 00165 * 00166 * NOTES 00167 * pathRoot can be NULL for Folders being a drive. 00168 * In this case the absolute path is built from pidlChild (eg. C:) 00169 */ 00170 static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot, 00171 LPCITEMIDLIST pidlChild, REFCLSID clsid, LPVOID * ppvOut) 00172 { 00173 HRESULT hr; 00174 00175 TRACE ("%p %s %p\n", pidlRoot, debugstr_w(pathRoot), pidlChild); 00176 00177 hr = SHCoCreateInstance(NULL, &clsid, NULL, IID_IShellFolder, ppvOut); 00178 if (SUCCEEDED (hr)) 00179 { 00180 LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild); 00181 IPersistFolder *pPF; 00182 IPersistFolder3 *ppf; 00183 00184 if (_ILIsFolder(pidlChild) && 00185 SUCCEEDED (((IUnknown *)(*ppvOut))->QueryInterface(IID_IPersistFolder3, (LPVOID *) & ppf))) 00186 { 00187 PERSIST_FOLDER_TARGET_INFO ppfti; 00188 00189 ZeroMemory (&ppfti, sizeof (ppfti)); 00190 00191 /* fill the PERSIST_FOLDER_TARGET_INFO */ 00192 ppfti.dwAttributes = -1; 00193 ppfti.csidl = -1; 00194 00195 /* build path */ 00196 if (pathRoot) 00197 { 00198 lstrcpynW (ppfti.szTargetParsingName, pathRoot, MAX_PATH - 1); 00199 PathAddBackslashW(ppfti.szTargetParsingName); /* FIXME: why have drives a backslash here ? */ 00200 } 00201 00202 if (pidlChild) 00203 { 00204 int len = wcslen(ppfti.szTargetParsingName); 00205 00206 if (!_ILSimpleGetTextW(pidlChild, ppfti.szTargetParsingName + len, MAX_PATH - len)) 00207 hr = E_INVALIDARG; 00208 } 00209 00210 ppf->InitializeEx(NULL, pidlAbsolute, &ppfti); 00211 ppf->Release(); 00212 } 00213 else if (SUCCEEDED ((hr = ((IUnknown *)(*ppvOut))->QueryInterface (IID_IPersistFolder, (LPVOID *) & pPF)))) 00214 { 00215 pPF->Initialize(pidlAbsolute); 00216 pPF->Release(); 00217 } 00218 ILFree (pidlAbsolute); 00219 } 00220 TRACE ("-- (%p) ret=0x%08x\n", *ppvOut, hr); 00221 return hr; 00222 } 00223 00224 /*********************************************************************** 00225 * SHELL32_BindToChild [Internal] 00226 * 00227 * Common code for IShellFolder_BindToObject. 00228 * 00229 * PARAMS 00230 * pidlRoot [I] The parent shell folder's absolute pidl. 00231 * pathRoot [I] Absolute dos path of the parent shell folder. 00232 * pidlComplete [I] PIDL of the child. Relative to pidlRoot. 00233 * riid [I] GUID of the interface, which ppvOut shall be bound to. 00234 * ppvOut [O] A reference to the child's interface (riid). 00235 * 00236 * NOTES 00237 * pidlComplete has to contain at least one non empty SHITEMID. 00238 * This function makes special assumptions on the shell namespace, which 00239 * means you probably can't use it for your IShellFolder implementation. 00240 */ 00241 HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, 00242 LPCWSTR pathRoot, LPCITEMIDLIST pidlComplete, REFIID riid, LPVOID * ppvOut) 00243 { 00244 GUID const *clsid; 00245 IShellFolder *pSF; 00246 HRESULT hr; 00247 LPITEMIDLIST pidlChild; 00248 00249 if (!pidlRoot || !ppvOut || !pidlComplete || !pidlComplete->mkid.cb) 00250 return E_INVALIDARG; 00251 00252 *ppvOut = NULL; 00253 00254 pidlChild = ILCloneFirst (pidlComplete); 00255 00256 if ((clsid = _ILGetGUIDPointer (pidlChild))) { 00257 /* virtual folder */ 00258 hr = SHELL32_CoCreateInitSF (pidlRoot, pathRoot, pidlChild, *clsid, (LPVOID *)&pSF); 00259 } else { 00260 /* file system folder */ 00261 CLSID clsidFolder = CLSID_ShellFSFolder; 00262 static const WCHAR wszCLSID[] = {'C','L','S','I','D',0}; 00263 WCHAR wszCLSIDValue[CHARS_IN_GUID], wszFolderPath[MAX_PATH], *pwszPathTail = wszFolderPath; 00264 00265 /* see if folder CLSID should be overridden by desktop.ini file */ 00266 if (pathRoot) { 00267 lstrcpynW(wszFolderPath, pathRoot, MAX_PATH); 00268 pwszPathTail = PathAddBackslashW(wszFolderPath); 00269 } 00270 00271 _ILSimpleGetTextW(pidlChild,pwszPathTail,MAX_PATH - (int)(pwszPathTail - wszFolderPath)); 00272 00273 if (SHELL32_GetCustomFolderAttributeFromPath (wszFolderPath, 00274 wszDotShellClassInfo, wszCLSID, wszCLSIDValue, CHARS_IN_GUID)) 00275 CLSIDFromString (wszCLSIDValue, &clsidFolder); 00276 00277 hr = SHELL32_CoCreateInitSF (pidlRoot, pathRoot, pidlChild, 00278 clsidFolder, (LPVOID *)&pSF); 00279 } 00280 ILFree (pidlChild); 00281 00282 if (SUCCEEDED (hr)) { 00283 if (_ILIsPidlSimple (pidlComplete)) { 00284 /* no sub folders */ 00285 hr = pSF->QueryInterface(riid, ppvOut); 00286 } else { 00287 /* go deeper */ 00288 hr = pSF->BindToObject(ILGetNext (pidlComplete), NULL, riid, ppvOut); 00289 } 00290 pSF->Release(); 00291 } 00292 00293 TRACE ("-- returning (%p) %08x\n", *ppvOut, hr); 00294 00295 return hr; 00296 } 00297 00298 /*********************************************************************** 00299 * SHELL32_GetDisplayNameOfChild 00300 * 00301 * Retrieves the display name of a child object of a shellfolder. 00302 * 00303 * For a pidl eg. [subpidl1][subpidl2][subpidl3]: 00304 * - it binds to the child shellfolder [subpidl1] 00305 * - asks it for the displayname of [subpidl2][subpidl3] 00306 * 00307 * Is possible the pidl is a simple pidl. In this case it asks the 00308 * subfolder for the displayname of an empty pidl. The subfolder 00309 * returns the own displayname eg. "::{guid}". This is used for 00310 * virtual folders with the registry key WantsFORPARSING set. 00311 */ 00312 HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, 00313 LPCITEMIDLIST pidl, DWORD dwFlags, LPWSTR szOut, DWORD dwOutLen) 00314 { 00315 LPITEMIDLIST pidlFirst; 00316 HRESULT hr = E_INVALIDARG; 00317 00318 TRACE ("(%p)->(pidl=%p 0x%08x %p 0x%08x)\n", psf, pidl, dwFlags, szOut, dwOutLen); 00319 pdump (pidl); 00320 00321 pidlFirst = ILCloneFirst(pidl); 00322 if (pidlFirst) 00323 { 00324 IShellFolder *psfChild; 00325 00326 hr = psf->BindToObject(pidlFirst, NULL, IID_IShellFolder, (LPVOID *) & psfChild); 00327 if (SUCCEEDED (hr)) 00328 { 00329 STRRET strTemp; 00330 LPITEMIDLIST pidlNext = ILGetNext (pidl); 00331 00332 hr = psfChild->GetDisplayNameOf(pidlNext, dwFlags, &strTemp); 00333 if (SUCCEEDED (hr)) 00334 { 00335 if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext)) 00336 hr = E_FAIL; 00337 } 00338 psfChild->Release(); 00339 } 00340 ILFree (pidlFirst); 00341 } else 00342 hr = E_OUTOFMEMORY; 00343 00344 TRACE ("-- ret=0x%08x %s\n", hr, debugstr_w(szOut)); 00345 00346 return hr; 00347 } 00348 00349 /*********************************************************************** 00350 * SHELL32_GetItemAttributes 00351 * 00352 * NOTES 00353 * Observed values: 00354 * folder: 0xE0000177 FILESYSTEM | HASSUBFOLDER | FOLDER 00355 * file: 0x40000177 FILESYSTEM 00356 * drive: 0xf0000144 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR 00357 * mycomputer: 0xb0000154 HASSUBFOLDER | FOLDER | FILESYSANCESTOR 00358 * (seems to be default for shell extensions if no registry entry exists) 00359 * 00360 * win2k: 00361 * folder: 0xF0400177 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR | CANMONIKER 00362 * file: 0x40400177 FILESYSTEM | CANMONIKER 00363 * drive 0xF0400154 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR | CANMONIKER | CANRENAME (LABEL) 00364 * 00365 * According to the MSDN documentation this function should not set flags. It claims only to reset flags when necessary. 00366 * However it turns out the native shell32.dll _sets_ flags in several cases - so do we. 00367 */ 00368 HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes) 00369 { 00370 DWORD dwAttributes; 00371 BOOL has_guid; 00372 static const DWORD dwSupportedAttr= 00373 SFGAO_CANCOPY | /*0x00000001 */ 00374 SFGAO_CANMOVE | /*0x00000002 */ 00375 SFGAO_CANLINK | /*0x00000004 */ 00376 SFGAO_CANRENAME | /*0x00000010 */ 00377 SFGAO_CANDELETE | /*0x00000020 */ 00378 SFGAO_HASPROPSHEET | /*0x00000040 */ 00379 SFGAO_DROPTARGET | /*0x00000100 */ 00380 SFGAO_LINK | /*0x00010000 */ 00381 SFGAO_READONLY | /*0x00040000 */ 00382 SFGAO_HIDDEN | /*0x00080000 */ 00383 SFGAO_FILESYSANCESTOR | /*0x10000000 */ 00384 SFGAO_FOLDER | /*0x20000000 */ 00385 SFGAO_FILESYSTEM | /*0x40000000 */ 00386 SFGAO_HASSUBFOLDER; /*0x80000000 */ 00387 00388 TRACE ("0x%08x\n", *pdwAttributes); 00389 00390 if (*pdwAttributes & ~dwSupportedAttr) 00391 { 00392 WARN ("attributes 0x%08x not implemented\n", (*pdwAttributes & ~dwSupportedAttr)); 00393 *pdwAttributes &= dwSupportedAttr; 00394 } 00395 00396 has_guid = _ILGetGUIDPointer(pidl) != NULL; 00397 00398 dwAttributes = *pdwAttributes; 00399 00400 if (has_guid && HCR_GetFolderAttributes(pidl, &dwAttributes)) 00401 *pdwAttributes = dwAttributes; 00402 else if (_ILGetDataPointer(pidl)) 00403 { 00404 dwAttributes = _ILGetFileAttributes(pidl, NULL, 0); 00405 00406 if (!dwAttributes && has_guid) 00407 { 00408 WCHAR path[MAX_PATH]; 00409 STRRET strret; 00410 00411 /* File attributes are not present in the internal PIDL structure, so get them from the file system. */ 00412 00413 HRESULT hr = psf->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strret); 00414 00415 if (SUCCEEDED(hr)) 00416 { 00417 hr = StrRetToBufW(&strret, pidl, path, MAX_PATH); 00418 00419 /* call GetFileAttributes() only for file system paths, not for parsing names like "::{...}" */ 00420 if (SUCCEEDED(hr) && path[0]!=':') 00421 dwAttributes = GetFileAttributesW(path); 00422 } 00423 } 00424 00425 /* Set common attributes */ 00426 *pdwAttributes |= SFGAO_FILESYSTEM | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | 00427 SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY; 00428 00429 if (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) 00430 { 00431 *pdwAttributes |= (SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_FILESYSANCESTOR); 00432 } 00433 else 00434 *pdwAttributes &= ~(SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_FILESYSANCESTOR); 00435 00436 if (dwAttributes & FILE_ATTRIBUTE_HIDDEN) 00437 *pdwAttributes |= SFGAO_HIDDEN; 00438 else 00439 *pdwAttributes &= ~SFGAO_HIDDEN; 00440 00441 if (dwAttributes & FILE_ATTRIBUTE_READONLY) 00442 *pdwAttributes |= SFGAO_READONLY; 00443 else 00444 *pdwAttributes &= ~SFGAO_READONLY; 00445 00446 if (SFGAO_LINK & *pdwAttributes) 00447 { 00448 char ext[MAX_PATH]; 00449 00450 if (!_ILGetExtension(pidl, ext, MAX_PATH) || lstrcmpiA(ext, "lnk")) 00451 *pdwAttributes &= ~SFGAO_LINK; 00452 } 00453 00454 if (SFGAO_HASSUBFOLDER & *pdwAttributes) 00455 { 00456 IShellFolder *psf2; 00457 if (SUCCEEDED(psf->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID *)&psf2))) 00458 { 00459 IEnumIDList *pEnumIL = NULL; 00460 if (SUCCEEDED(psf2->EnumObjects(0, SHCONTF_FOLDERS, &pEnumIL))) 00461 { 00462 if (pEnumIL->Skip(1) != S_OK) 00463 *pdwAttributes &= ~SFGAO_HASSUBFOLDER; 00464 pEnumIL->Release(); 00465 } 00466 psf2->Release(); 00467 } 00468 } 00469 } else 00470 *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME|SFGAO_CANLINK; 00471 00472 TRACE ("-- 0x%08x\n", *pdwAttributes); 00473 return S_OK; 00474 } 00475 00476 /*********************************************************************** 00477 * SHELL32_CompareIDs 00478 */ 00479 HRESULT SHELL32_CompareIDs (IShellFolder * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) 00480 { 00481 int type1, 00482 type2; 00483 char szTemp1[MAX_PATH]; 00484 char szTemp2[MAX_PATH]; 00485 HRESULT nReturn; 00486 LPITEMIDLIST firstpidl, 00487 nextpidl1, 00488 nextpidl2; 00489 IShellFolder *psf; 00490 00491 /* test for empty pidls */ 00492 BOOL isEmpty1 = _ILIsDesktop (pidl1); 00493 BOOL isEmpty2 = _ILIsDesktop (pidl2); 00494 00495 if (isEmpty1 && isEmpty2) 00496 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 0 ); 00497 if (isEmpty1) 00498 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, (WORD)-1 ); 00499 if (isEmpty2) 00500 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 1 ); 00501 00502 /* test for different types. Sort order is the PT_* constant */ 00503 type1 = _ILGetDataPointer (pidl1)->type; 00504 type2 = _ILGetDataPointer (pidl2)->type; 00505 if (type1 < type2) 00506 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, (WORD)-1 ); 00507 else if (type1 > type2) 00508 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 1 ); 00509 00510 /* test for name of pidl */ 00511 _ILSimpleGetText (pidl1, szTemp1, MAX_PATH); 00512 _ILSimpleGetText (pidl2, szTemp2, MAX_PATH); 00513 nReturn = lstrcmpiA (szTemp1, szTemp2); 00514 if (nReturn < 0) 00515 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, (WORD)-1 ); 00516 else if (nReturn > 0) 00517 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 1 ); 00518 00519 /* test of complex pidls */ 00520 firstpidl = ILCloneFirst (pidl1); 00521 nextpidl1 = ILGetNext (pidl1); 00522 nextpidl2 = ILGetNext (pidl2); 00523 00524 /* optimizing: test special cases and bind not deeper */ 00525 /* the deeper shellfolder would do the same */ 00526 isEmpty1 = _ILIsDesktop (nextpidl1); 00527 isEmpty2 = _ILIsDesktop (nextpidl2); 00528 00529 if (isEmpty1 && isEmpty2) { 00530 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 0 ); 00531 } else if (isEmpty1) { 00532 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, (WORD)-1 ); 00533 } else if (isEmpty2) { 00534 return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 1 ); 00535 /* optimizing end */ 00536 } else if (SUCCEEDED (iface->BindToObject(firstpidl, NULL, IID_IShellFolder, (LPVOID *)&psf))) { 00537 nReturn = psf->CompareIDs(lParam, nextpidl1, nextpidl2); 00538 psf->Release(); 00539 } 00540 ILFree (firstpidl); 00541 return nReturn; 00542 } 00543 00544 /*********************************************************************** 00545 * SHCreateLinks 00546 * 00547 * Undocumented. 00548 */ 00549 HRESULT WINAPI SHCreateLinks( HWND hWnd, LPCSTR lpszDir, LPDATAOBJECT lpDataObject, 00550 UINT uFlags, LPITEMIDLIST *lppidlLinks) 00551 { 00552 FIXME("%p %s %p %08x %p\n",hWnd,lpszDir,lpDataObject,uFlags,lppidlLinks); 00553 return E_NOTIMPL; 00554 } 00555 00556 /*********************************************************************** 00557 * SHOpenFolderAndSelectItems 00558 * 00559 * Unimplemented. 00560 */ 00561 EXTERN_C HRESULT 00562 WINAPI 00563 SHOpenFolderAndSelectItems(LPITEMIDLIST pidlFolder, 00564 UINT cidl, 00565 PCUITEMID_CHILD_ARRAY apidl, 00566 DWORD dwFlags) 00567 { 00568 FIXME("SHOpenFolderAndSelectItems() stub\n"); 00569 return E_NOTIMPL; 00570 } Generated on Sat May 26 2012 04:25:04 for ReactOS by
1.7.6.1
|