Russian Qt Forum
Ноябрь 26, 2024, 20:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запуск проводника Windows  (Прочитано 6642 раз)
hank
Гость
« : Март 03, 2011, 13:16 »

Для запуска виндосовского проводника испольщую следующий код:
Код
C++ (Qt)
QString FileName = QFileDialog::getExistingDirectory(this,"Choose directory","/",QFileDialog::ShowDirsOnly
                                                | QFileDialog::DontResolveSymlinks);
 
QUrl url = QUrl::QUrl("file:///"+FileName);
 
QDesktopServices::openUrl(url);

В итоге получаю, что на функции openUrl приложение подвисает минуты на три и только потом открывает проводник. При этом если я продолжаю выбирать другие папки, они открываются с нормальной скоростью.
Что я делаю не так?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 03, 2011, 13:19 »

1. Используй QUrl QUrl::fromLocalFile ( const QString & localFile ) [static].
2. Виснет именно на QDesktopServices::openUrl(url);?
3. А так проводник быстро запускается?
4. Путь не сетевой, случайно?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
hank
Гость
« Ответ #2 : Март 03, 2011, 13:53 »

1. Быстрее не стало.
2. Да.
3. Да.
4. Нет, путь не сетевой.

Последующие вызовы openUrl из того же приложения выполняются быстро.
Записан
merke
Гость
« Ответ #3 : Март 03, 2011, 14:57 »

У меня тоже самое было, когда я открывал ссылку на сайт в браузере.
Решения не нашел, наверное так у всех и это - БАГ детектед
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Март 03, 2011, 15:28 »

Судя по коду qdesktopservices_win.cpp:
Код
C++ (Qt)
static bool openDocument(const QUrl &file)
{
if (!file.isValid())
return false;
QString filePath = file.toLocalFile();
if (filePath.isEmpty())
filePath = file.toString();
quintptr returnValue = (quintptr)ShellExecute(0, 0, (wchar_t*)filePath.utf16(), 0, 0, SW_SHOWNORMAL);
return (returnValue > 32); //ShellExecute returns a value greater than 32 if successful
}
 
Qt и висеть-то негде. Надо WinAPI::ShellExecute() в простом тесте проверить с таким url.


ShellExecute Function Remarks:
Цитировать
Because ShellExecute can delegate execution to Shell extensions (data sources, context menu handlers, verb implementations) that are activated using Component Object Model (COM), COM should be initialized before ShellExecute is called. Some Shell extensions require the COM single-threaded apartment (STA) type. In that case, COM should be initialized as shown here:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)

There are certainly instances where ShellExecute does not use one of these types of Shell extension and those instances would not require COM to be initialized at all. Nonetheless, it is good practice to always initalize COM before using this function.
Может в этом дело?
« Последнее редактирование: Март 03, 2011, 15:37 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.228 секунд. Запросов: 22.