shell32 - file not found [new version]

Martin Fuchs martin-fuchs at gmx.net
Wed Apr 14 13:24:16 CDT 2004


Now using Juan's proposed solution...


Changelog:
return "file not found" error values instead of E_INVALIDARG if _ILCreateFromPathA() failed to find files


Index: pidl.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.c,v
retrieving revision 1.112
diff -u -p -d -r1.112 pidl.c
--- pidl.c	8 Apr 2004 04:37:43 -0000	1.112
+++ pidl.c	14 Apr 2004 18:24:02 -0000
@@ -1604,19 +1604,21 @@ LPITEMIDLIST _ILCreateFromFindDataA(WIN3
     return pidl;
 }
 
-LPITEMIDLIST _ILCreateFromPathA(LPCSTR szPath)
+HRESULT _ILCreateFromPathA(LPCSTR szPath, LPITEMIDLIST* ppidl)
 {
 	HANDLE hFile;
 	WIN32_FIND_DATAA stffile;
-	LPITEMIDLIST pidl = NULL;
-	
+
 	hFile = FindFirstFileA(szPath, &stffile);
-	if (hFile != INVALID_HANDLE_VALUE) 
-	{
-	  pidl = _ILCreateFromFindDataA(&stffile);
-	  FindClose(hFile);
-	}
-	return pidl;
+
+	if (hFile == INVALID_HANDLE_VALUE)
+		return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
+
+	FindClose(hFile);
+
+	*ppidl = _ILCreateFromFindDataA(&stffile);
+
+	return S_OK;
 }
 
 LPITEMIDLIST _ILCreateDrive( LPCSTR lpszNew)
Index: pidl.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.h,v
retrieving revision 1.39
diff -u -p -d -r1.39 pidl.h
--- pidl.h	8 Apr 2004 04:37:43 -0000	1.39
+++ pidl.h	14 Apr 2004 18:24:02 -0000
@@ -199,7 +199,7 @@ LPITEMIDLIST	_ILCreateGuidFromStrA(LPCST
 /* Commonly used PIDLs representing file system objects. */
 LPITEMIDLIST	_ILCreateDesktop	(void);
 LPITEMIDLIST	_ILCreateFromFindDataA(WIN32_FIND_DATAA *stffile);
-LPITEMIDLIST	_ILCreateFromPathA	(LPCSTR szPath);
+HRESULT		_ILCreateFromPathA	(LPCSTR szPath, LPITEMIDLIST* ppidl);
 
 /* Other helpers */
 LPITEMIDLIST	_ILCreateMyComputer	(void);
Index: shfldr_desktop.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shfldr_desktop.c,v
retrieving revision 1.23
diff -u -p -d -r1.23 shfldr_desktop.c
--- shfldr_desktop.c	13 Apr 2004 00:19:11 -0000	1.23
+++ shfldr_desktop.c	14 Apr 2004 18:24:03 -0000
@@ -197,7 +197,7 @@ static HRESULT WINAPI ISF_Desktop_fnPars
     WCHAR szElement[MAX_PATH];
     LPCWSTR szNext = NULL;
     LPITEMIDLIST pidlTemp = NULL;
-    HRESULT hr = E_INVALIDARG;
+    HRESULT hr = S_OK;
     char szPath[MAX_PATH];
     DWORD len;
     CLSID clsid;
@@ -234,7 +234,7 @@ static HRESULT WINAPI ISF_Desktop_fnPars
 	    PathAddBackslashA(szPath);
 	    len = lstrlenA(szPath);
 	    WideCharToMultiByte(CP_ACP, 0, lpszDisplayName, -1, szPath + len, MAX_PATH - len, NULL, NULL);
-	    pidlTemp = _ILCreateFromPathA(szPath);
+	    hr = _ILCreateFromPathA(szPath, &pidlTemp);
 	} else {
 	    pidlTemp = _ILCreateMyComputer();
 	}
@@ -242,13 +242,12 @@ static HRESULT WINAPI ISF_Desktop_fnPars
 	szNext = NULL;
     }
 
-    if (pidlTemp) {
+    if (SUCCEEDED(hr) && pidlTemp) {
 	if (szNext && *szNext) {
 	    hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes);
 	} else {
-	    hr = S_OK;
 	    if (pdwAttributes && *pdwAttributes) {
-		SHELL32_GetItemAttributes (_IShellFolder_ (This), pidlTemp, pdwAttributes);
+		hr = SHELL32_GetItemAttributes (_IShellFolder_ (This), pidlTemp, pdwAttributes);
 	    }
 	}
     }
Index: shfldr_fs.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shfldr_fs.c,v
retrieving revision 1.22
diff -u -p -d -r1.22 shfldr_fs.c
--- shfldr_fs.c	13 Apr 2004 00:19:11 -0000	1.22
+++ shfldr_fs.c	14 Apr 2004 18:24:03 -0000
@@ -353,22 +353,22 @@ IShellFolder_fnParseDisplayName (IShellF
 	WideCharToMultiByte(CP_ACP, 0, szElement, -1, szPath + len, MAX_PATH - len, NULL, NULL);
 
 	/* get the pidl */
-	pidlTemp = _ILCreateFromPathA(szPath);
-	if (pidlTemp) {
+	hr = _ILCreateFromPathA(szPath, &pidlTemp);
+
+	if (SUCCEEDED(hr)) {
 	    if (szNext && *szNext) {
 		/* try to analyse the next element */
 		hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes);
 	    } else {
 		/* it's the last element */
 		if (pdwAttributes && *pdwAttributes) {
-		    SHELL32_GetItemAttributes (_IShellFolder_ (This), pidlTemp, pdwAttributes);
+		    hr = SHELL32_GetItemAttributes (_IShellFolder_ (This), pidlTemp, pdwAttributes);
 		}
-		hr = S_OK;
 	    }
 	}
     }
 
-    if (!hr)
+    if (SUCCEEDED(hr))
 	*ppidl = pidlTemp;
     else
 	*ppidl = NULL;
@@ -748,11 +748,16 @@ static HRESULT WINAPI IShellFolder_fnSet
     szDest[MAX_PATH - 1] = 0;
     TRACE ("src=%s dest=%s\n", szSrc, szDest);
     if (MoveFileA (szSrc, szDest)) {
+	HRESULT hr = S_OK;
+
 	if (pPidlOut)
-	    *pPidlOut = _ILCreateFromPathA(szDest);
+	    hr = _ILCreateFromPathA(szDest, pPidlOut);
+
 	SHChangeNotify (bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM, SHCNF_PATHA, szSrc, szDest);
-	return S_OK;
+
+	return hr;
     }
+
     return E_FAIL;
 }
 
@@ -977,9 +982,11 @@ static HRESULT WINAPI ISFHelper_fnAddFol
     bRes = CreateDirectoryA (lpstrNewDir, NULL);
     if (bRes) {
 	SHChangeNotify (SHCNE_MKDIR, SHCNF_PATHA, lpstrNewDir, NULL);
-	if (ppidlOut)
-	    *ppidlOut = _ILCreateFromPathA(lpstrNewDir);
+
 	hres = S_OK;
+
+	if (ppidlOut)
+    	    hres = _ILCreateFromPathA(lpstrNewDir, ppidlOut);
     } else {
 	char lpstrText[128 + MAX_PATH];
 	char lpstrTempText[128];





More information about the wine-patches mailing list