diff options
author | Cristian Adam <cristian.adam@qt.io> | 2024-04-30 18:05:17 +0200 |
---|---|---|
committer | Cristian Adam <cristian.adam@qt.io> | 2024-05-02 13:40:56 +0000 |
commit | 2c4b7fa02a822754049610781a8137ddb650b830 (patch) | |
tree | 116b7e6cbb2b710ed69720b987236029ec551e12 | |
parent | ff6e8656d707c2e2930449a1c42dceed9b48c2ef (diff) |
Core: Use Windows API to create path to explorer.exe
Searching after "explorer.exe" in PATH can fail, as seen in a report on
#qtcreator channel on Discord.
Explorer.exe is always part of %systemroot%, which can be
programatically obtained via SHGetFolderPath function.
Fixes: QTCREATORBUG-30765
Change-Id: Id2c4f3bd9c51234cb9e16d936202dfbcb1975606
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: David Schulz <david.schulz@qt.io>
-rw-r--r-- | src/plugins/coreplugin/fileutils.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/plugins/coreplugin/fileutils.cpp b/src/plugins/coreplugin/fileutils.cpp index e432543604..c066e977d3 100644 --- a/src/plugins/coreplugin/fileutils.cpp +++ b/src/plugins/coreplugin/fileutils.cpp @@ -32,10 +32,28 @@ #include <QTextStream> #include <QTextCodec> +#ifdef Q_OS_WIN +#ifdef QTCREATOR_PCH_H +#define CALLBACK WINAPI +#endif +#include <qt_windows.h> +#include <shlobj.h> +#endif + using namespace Utils; namespace Core { +static FilePath windowsDirectory() +{ +#ifdef Q_OS_WIN + wchar_t str[UNICODE_STRING_MAX_CHARS] = {}; + if (SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_WINDOWS, nullptr, 0, str))) + return FilePath::fromUserInput(QString::fromUtf16(reinterpret_cast<char16_t *>(str))); +#endif + return {}; +} + // Show error with option to open settings. static void showGraphicalShellError(QWidget *parent, const QString &app, const QString &error) { @@ -56,13 +74,7 @@ void FileUtils::showInGraphicalShell(QWidget *parent, const FilePath &pathIn) const QFileInfo fileInfo = pathIn.toFileInfo(); // Mac, Windows support folder or file. if (HostOsInfo::isWindowsHost()) { - const FilePath explorer = FilePath("explorer.exe").searchInPath(); - if (explorer.isEmpty()) { - QMessageBox::warning(parent, - Tr::tr("Launching Windows Explorer Failed"), - Tr::tr("Could not find explorer.exe in path to launch Windows Explorer.")); - return; - } + const FilePath explorer = windowsDirectory().pathAppended("explorer.exe"); QStringList param; if (!pathIn.isDir()) param += QLatin1String("/select,"); |