Browse Source

Prevent crash when open torrent destination folder

Uses the same workaround as Qt does to call ShellExecute() when you use QDesktopServices::openUrl().
PR #16670.
Closes #16423.
adaptive-webui-19844
Vladimir Golovnev 3 years ago committed by GitHub
parent
commit
5960e7dda6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      src/gui/utils.cpp

14
src/gui/utils.cpp

@ -43,6 +43,7 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QScreen> #include <QScreen>
#include <QStyle> #include <QStyle>
#include <QThread>
#include <QUrl> #include <QUrl>
#include <QWidget> #include <QWidget>
#include <QWindow> #include <QWindow>
@ -159,15 +160,22 @@ void Utils::Gui::openFolderSelect(const Path &path)
} }
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
HRESULT hresult = ::CoInitializeEx(nullptr, COINIT_MULTITHREADED); auto *thread = QThread::create([path]()
PIDLIST_ABSOLUTE pidl = ::ILCreateFromPathW(reinterpret_cast<PCTSTR>(path.toString().utf16())); {
if (SUCCEEDED(::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)))
{
PIDLIST_ABSOLUTE pidl = ::ILCreateFromPathW(reinterpret_cast<const wchar_t *>(path.toString().utf16()));
if (pidl) if (pidl)
{ {
::SHOpenFolderAndSelectItems(pidl, 0, nullptr, 0); ::SHOpenFolderAndSelectItems(pidl, 0, nullptr, 0);
::ILFree(pidl); ::ILFree(pidl);
} }
if ((hresult == S_OK) || (hresult == S_FALSE))
::CoUninitialize(); ::CoUninitialize();
}
});
QObject::connect(thread, &QThread::finished, thread, &QObject::deleteLater);
thread->start();
#elif defined(Q_OS_UNIX) && !defined(Q_OS_MACOS) #elif defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
QProcess proc; QProcess proc;
proc.start(u"xdg-mime"_qs, {u"query"_qs, u"default"_qs, u"inode/directory"_qs}); proc.start(u"xdg-mime"_qs, {u"query"_qs, u"default"_qs, u"inode/directory"_qs});

Loading…
Cancel
Save