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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt and file association (Ассоциации файлов)  (Прочитано 16178 раз)
notnext
Гость
« : Июль 06, 2010, 14:02 »

Доброго времени суток. СКАЖУ СРАЗУ - ПОД ВИНДУ НИКОГДА НЕ ПИСАЛ! А СЕЙЧАС НАДА!  Злой
Сталкнулся с такой задачей. Есть приложение постоенное на phonon которое крутит видео файлики.
В диалоге настроек необходимо было сделать QCHeckBox - мол ассоциациировать этот тип файла или нет.
К примеру .avi
Если галочка стоит, то открываем моим приложением, если нет, то тем которое было установлено до меня.
Сейчас использую ( reg.exe import|export|delete|add ) дергая его из QProcess
МНЕ ЭТО НЕ ПОДХОДИТ!!!! Работает через раз и по разному на XP и 7

Вычитал еще, что ассоциации в виинде храняться:
HKCR\.avi
HKLM\Software\Classes\.avi
Где именно и кто приоритетней не понял


необходимо вроде создать
HKLM\Software\Classes\MyApp.avi
HKLM\Software\Classes\MyApp.avi\shell\open
HKLM\Software\Classes\MyApp.avi\shell\play

что то подобное и сделал при помощи reg.exe и QProcess

И теперь я запутался!
ПРОШУ ПОМОЩИ у тех кто это деелал!

В итоге надо как-то сохранить старые ассоциации поставить мои и при отмене моих вернуть старые!

Приложение должно работать на всех виндах начиная с XP.

Как это грамотно и желательно побыстрее сделать?
Буду очнь рад примеру или ошметку исходника  Подмигивающий
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #1 : Июль 06, 2010, 16:09 »

В винде читать и писать в реетср можно через  QSettings. Как-то так (код не тестил, т.к. у меня не винда).

 
Код
C++ (Qt)
QSettings settings("HKEY_LOCAL_MACHINE\\Software\\Classes\MyApp.avi",
                   QSettings::NativeFormat);
 
settings.setValue("HKEY_LOCAL_MACHINE\\Software\\Classes\\MyApp.avi\shell\open", "value");
settings.Value("HKEY_LOCAL_MACHINE\\Software\\Classes\\MyApp.avi\shell\open");

Подробней смотрите в документации

Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
zenden
Гость
« Ответ #2 : Июль 06, 2010, 17:40 »

Как записать вроде-бы ясно.
Другой вопрос как это всё потом грамотно удалить  Непонимающий

И есть ли кроссплатформенные библиотеки для этого ? чтобы хотя бы линь и вынь
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #3 : Июль 06, 2010, 18:07 »

Удаление -- void QSettings::remove ( const QString & key )  тыц

В  Linux реестра нет,  файловые ассоциации  лежат в т.н "базе MIME-типов".  

http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html
http://www.freedesktop.org/wiki/Specifications/mime-actions-spec

Кроссплатформенного решения именно для "ассоциации типа файла со своим приложением" вроде бы нет.

Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
notnext
Гость
« Ответ #4 : Июль 07, 2010, 08:12 »

Кросс-платформенного решения НЕТ! Это факт!  Плачущий

В UNIX системах вся настроечная инфа хранится в файликах типа .MyApp
QSettings в UNIX'ах работают именно с этими файликами.
QSettings в Windows работает с реестром. Это я в принципе знаю. Но хочу подчеркнуть что работа идет только со строками (считать, записасть)

Еще раз хочу объяснить задачу. Мне необходимо:
1) сохранить настройки ассоциаций до меня (к примеру .wmv открывать в Windows Media Player, .avi открывать в VLC)
2) потом выставить свои (.wmv и .avi открывать моим)
3) и иметь возможность все вернуть обратно (1 шаг).

Очень сильно еще интересует где их правильно выставить и откуда сохранить. В каких ветках реестра больший приоритет. Я именно там и запутался.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Июль 07, 2010, 08:34 »

Цитировать
1) сохранить настройки ассоциаций до меня (к примеру .wmv открывать в Windows Media Player, .avi открывать в VLC)
Ну так при первом запуске вашего приложения сохраните те значения что были по умолчанию в реестре в каком-нить конфиге.
Цитировать
2) потом выставить свои (.wmv и .avi открывать моим)
Ну теперь выставляйте.
Цитировать
3) и иметь возможность все вернуть обратно (1 шаг).
т.к. вы ранее уже сохранили умолчательные настройки до этого в п.1. то восстановить не составит труда.

Цитировать
Очень сильно еще интересует где их правильно выставить и откуда сохранить. В каких ветках реестра больший приоритет. Я именно там и запутался.
Ну так попробуйте методом тыка - перепривяжите какое нибудь расширение к другому приложению и посмотрите что и где изменилось в реестре.

А если нужно реально разобраться - то на винфак! Улыбающийся

---

PS: Да, задачка не простая.

PSPS: может это пригодится: http://delphidevelop.ru/publ/13-1-0-229
« Последнее редактирование: Июль 07, 2010, 08:59 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #6 : Июль 07, 2010, 11:37 »

Я для своего приложения делал ассоциацию. Вот выдранный код:
Код
C++ (Qt)
       QSettings settings ("HKEY_CLASSES_ROOT", QSettings::NativeFormat);                                                                                  
 
       settings.setValue (".dbf/.", "QDBFRedactor.file");                                                                                                  
       settings.setValue ("QDBFRedactor.file/.", tr("File of database"));                                                                                  
       settings.setValue ("QDBFRedactor.file/shell/open/command/.",                                                                                        
                                          "\"" + QDir::toNativeSeparators (QCoreApplication::applicationFilePath()) + "\"" + " \"%1\"");
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
zenden
Гость
« Ответ #7 : Июль 07, 2010, 12:04 »

А как вообще действуют другие приложения win при деинсталляции? Они просто удаляют ассоциации и ничего не восстанавливают?
Записан
notnext
Гость
« Ответ #8 : Июль 07, 2010, 13:22 »

А как вообще действуют другие приложения win при деинсталляции? Они просто удаляют ассоциации и ничего не восстанавливают?

Вообще такую задачу, как ассоциация файлов решают с помощью инсталятора (В момент инсталяции ассоциируют, а в момент деинсталяции обычно ничего не делают)

А в моем случае мне из программы нужно чекбоксом управлять ассоциацией (заказчик мудак хочет и все Злой)

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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