aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@qt.io>2024-04-30 18:05:17 +0200
committerCristian Adam <cristian.adam@qt.io>2024-05-02 13:40:56 +0000
commit2c4b7fa02a822754049610781a8137ddb650b830 (patch)
tree116b7e6cbb2b710ed69720b987236029ec551e12
parentff6e8656d707c2e2930449a1c42dceed9b48c2ef (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.cpp26
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,");