Changelog - dlls/shell32/shfldr.h - dlls/shell32/shlfolder.c Modify helper function to accept also a bind context to pass through - dlls/shell32/shfldr_desktop.c - dlls/shell32/shfldr_fs.c - dlls/shell32/shfldr_mycomp.c Pass through the bind context parameter License: X11/LGPL Rolf Kalbermatter =================================================================== RCS file: /home/wine/wine/dlls/shell32/shfldr.h,v retrieving revision 1.2 diff -u -r1.2 shfldr.h --- dlls/shell32/shfldr.h 2 Sep 2003 01:01:06 -0000 1.2 +++ dlls/shell32/shfldr.h 11 Sep 2003 18:03:20 -0000 @@ -32,8 +32,8 @@ #define GET_SHGDN_RELATION(dwFlags) ((DWORD)dwFlags & (DWORD)0x000000FF) LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut); -HRESULT SHELL32_ParseNextElement (HWND hwndOwner, IShellFolder2 * psf, LPITEMIDLIST * pidlInOut, LPOLESTR szNext, - DWORD * pEaten, DWORD * pdwAttributes); +HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST * pidlInOut, + LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes); HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes); HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidlChild, REFCLSID clsid, REFIID iid, LPVOID * ppvOut); =================================================================== RCS file: /home/wine/wine/dlls/shell32/shlfolder.c,v retrieving revision 1.83 diff -u -r1.83 shlfolder.c --- dlls/shell32/shlfolder.c 9 Sep 2003 19:39:31 -0000 1.83 +++ dlls/shell32/shlfolder.c 11 Sep 2003 18:03:22 -0000 @@ -105,8 +105,7 @@ return pszTail; } -HRESULT SHELL32_ParseNextElement (HWND hwndOwner, - IShellFolder2 * psf, +HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes) { HRESULT hr = E_OUTOFMEMORY; @@ -114,13 +113,13 @@ pidlTemp = NULL; IShellFolder *psfChild; - TRACE ("(%p, %p, %s)\n", psf, pidlInOut ? *pidlInOut : NULL, debugstr_w (szNext)); + TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlInOut ? *pidlInOut : NULL, debugstr_w (szNext)); /* get the shellfolder for the child pidl and let it analyse further */ - hr = IShellFolder_BindToObject (psf, *pidlInOut, NULL, &IID_IShellFolder, (LPVOID *) & psfChild); + hr = IShellFolder_BindToObject (psf, *pidlInOut, pbc, &IID_IShellFolder, (LPVOID *) & psfChild); if (SUCCEEDED (hr)) { - hr = IShellFolder_ParseDisplayName (psfChild, hwndOwner, NULL, szNext, pEaten, &pidlOut, pdwAttributes); + hr = IShellFolder_ParseDisplayName (psfChild, hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes); IShellFolder_Release (psfChild); pidlTemp = ILCombine (*pidlInOut, pidlOut); @@ -390,7 +389,7 @@ } /*********************************************************************** - * SHELL32_GetItemAttributes + * SHELL32_CompareIDs */ HRESULT SHELL32_CompareIDs (IShellFolder * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { =================================================================== RCS file: /home/wine/wine/dlls/shell32/shfldr_desktop.c,v retrieving revision 1.12 diff -u -r1.12 shfldr_desktop.c --- dlls/shell32/shfldr_desktop.c 9 Sep 2003 19:39:31 -0000 1.12 +++ dlls/shell32/shfldr_desktop.c 11 Sep 2003 18:03:21 -0000 @@ -189,7 +189,7 @@ */ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface, HWND hwndOwner, - LPBC pbcReserved, + LPBC pbc, LPOLESTR lpszDisplayName, DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) { @@ -198,13 +198,19 @@ WCHAR szElement[MAX_PATH]; LPCWSTR szNext = NULL; LPITEMIDLIST pidlTemp = NULL; - HRESULT hr = E_OUTOFMEMORY; + HRESULT hr = E_INVALIDARG; + char szPath[MAX_PATH]; + DWORD len; CLSID clsid; TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", - This, hwndOwner, pbcReserved, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); + This, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); + + if (!lpszDisplayName || !ppidl) + return E_INVALIDARG; *ppidl = 0; + if (pchEaten) *pchEaten = 0; /* strange but like the original */ @@ -217,21 +223,24 @@ /* it's a filesystem path with a drive. Let MyComputer parse it */ pidlTemp = _ILCreateMyComputer (); szNext = lpszDisplayName; + } else if (PathIsUNCW(lpszDisplayName)) { + pidlTemp = _ILCreateNetwork(); + szNext = lpszDisplayName; } else { /* it's a filesystem path on the desktop. Let a FSFolder parse it */ - WCHAR szCompletePath[MAX_PATH]; - /* build a complete path to create a simpel pidl */ - MultiByteToWideChar (CP_ACP, 0, This->sPathTarget, -1, szCompletePath, MAX_PATH); - PathAddBackslashW (szCompletePath); - lstrcatW (szCompletePath, lpszDisplayName); - pidlTemp = SHSimpleIDListFromPathW (lpszDisplayName); + /* build a complete path to create a simple pidl */ + lstrcpyA(szPath, This->sPathTarget); + PathAddBackslashA(szPath); + len = lstrlenA(szPath); + WideCharToMultiByte(CP_ACP, 0, lpszDisplayName, -1, szPath + len, MAX_PATH - len, NULL, NULL); + pidlTemp = _ILCreateFromPathA(szPath); szNext = lpszDisplayName; } if (pidlTemp) { if (szNext && *szNext) { - hr = SHELL32_ParseNextElement (hwndOwner, iface, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); + hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); } else { hr = S_OK; if (pdwAttributes && *pdwAttributes) { =================================================================== RCS file: /home/wine/wine/dlls/shell32/shfldr_fs.c,v retrieving revision 1.14 diff -u -r1.14 shfldr_fs.c --- dlls/shell32/shfldr_fs.c 9 Sep 2003 19:39:31 -0000 1.14 +++ dlls/shell32/shfldr_fs.c 11 Sep 2003 18:03:21 -0000 @@ -319,7 +319,7 @@ static HRESULT WINAPI IShellFolder_fnParseDisplayName (IShellFolder2 * iface, HWND hwndOwner, - LPBC pbcReserved, + LPBC pbc, LPOLESTR lpszDisplayName, DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) { @@ -333,7 +333,7 @@ DWORD len; TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", - This, hwndOwner, pbcReserved, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); + This, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); if (!lpszDisplayName || !ppidl) return E_INVALIDARG; @@ -356,7 +356,7 @@ if (pidlTemp) { if (szNext && *szNext) { /* try to analyse the next element */ - hr = SHELL32_ParseNextElement (hwndOwner, iface, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); + hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); } else { /* it's the last element */ if (pdwAttributes && *pdwAttributes) { =================================================================== RCS file: /home/wine/wine/dlls/shell32/shfldr_mycomp.c,v retrieving revision 1.9 diff -u -r1.9 shfldr_mycomp.c --- dlls/shell32/shfldr_mycomp.c 5 Sep 2003 23:08:31 -0000 1.9 +++ dlls/shell32/shfldr_mycomp.c 11 Sep 2003 18:03:22 -0000 @@ -189,7 +189,7 @@ static HRESULT WINAPI ISF_MyComputer_fnParseDisplayName (IShellFolder2 * iface, HWND hwndOwner, - LPBC pbcReserved, + LPBC pbc, LPOLESTR lpszDisplayName, DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) { @@ -202,7 +202,7 @@ LPITEMIDLIST pidlTemp; TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", - This, hwndOwner, pbcReserved, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); + This, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); *ppidl = 0; if (pchEaten) @@ -215,7 +215,7 @@ pidlTemp = _ILCreateDrive (szTempA); if (szNext && *szNext) { - hr = SHELL32_ParseNextElement (hwndOwner, iface, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); + hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); } else { if (pdwAttributes && *pdwAttributes) { SHELL32_GetItemAttributes (_IShellFolder_ (This), pidlTemp, pdwAttributes);