ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

shlfolder.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.