Always fall back to OpenFolderViaShell when trying to reveal a file

We should always fallback to OpenFolderViaShell when revealing a file fails,
since this API seems to be highly subject to Random Bad Things happening to
you.
This commit is contained in:
Paul Betts 2016-01-13 12:26:57 -08:00 committed by Cheng Zhao
parent d195cc3796
commit 05aeceeb52

View file

@ -238,7 +238,7 @@ void ShowItemInFolder(const base::FilePath& full_path) {
(GetProcAddress(shell32_base, "SHOpenFolderAndSelectItems"));
}
if (!open_folder_and_select_itemsPtr) {
ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW);
ui::win::OpenFolderViaShell(dir);
return;
}
@ -251,15 +251,19 @@ void ShowItemInFolder(const base::FilePath& full_path) {
hr = desktop->ParseDisplayName(NULL, NULL,
const_cast<wchar_t *>(dir.value().c_str()),
NULL, &dir_item, NULL);
if (FAILED(hr))
if (FAILED(hr)) {
ui::win::OpenFolderViaShell(dir);
return;
}
base::win::ScopedCoMem<ITEMIDLIST> file_item;
hr = desktop->ParseDisplayName(NULL, NULL,
const_cast<wchar_t *>(full_path.value().c_str()),
NULL, &file_item, NULL);
if (FAILED(hr))
if (FAILED(hr)) {
ui::win::OpenFolderViaShell(dir);
return;
}
const ITEMIDLIST* highlight[] = { file_item };
@ -271,7 +275,7 @@ void ShowItemInFolder(const base::FilePath& full_path) {
// found" even though the file is there. In these cases, ShellExecute()
// seems to work as a fallback (although it won't select the file).
if (hr == ERROR_FILE_NOT_FOUND) {
ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW);
ui::win::OpenFolderViaShell(dir);
} else {
LPTSTR message = NULL;
DWORD message_length = FormatMessage(
@ -284,6 +288,8 @@ void ShowItemInFolder(const base::FilePath& full_path) {
<< " " << reinterpret_cast<LPTSTR>(&message);
if (message)
LocalFree(message);
ui::win::OpenFolderViaShell(dir);
}
}
}