Russian Qt Forum

Qt => Общие вопросы => Тема начата: notnext от Июль 06, 2010, 14:02



Название: Qt and file association (Ассоциации файлов)
Отправлено: 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.

Как это грамотно и желательно побыстрее сделать?
Буду очнь рад примеру или ошметку исходника  ;)


Название: Re: Qt and file association (Ассоциации файлов)
Отправлено: DOOMer от Июль 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");

Подробней смотрите в документации (http://doc.qt.nokia.com/4.6/qsettings.html)



Название: Re: Qt and file association (Ассоциации файлов)
Отправлено: zenden от Июль 06, 2010, 17:40
Как записать вроде-бы ясно.
Другой вопрос как это всё потом грамотно удалить  ???

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


Название: Re: Qt and file association (Ассоциации файлов)
Отправлено: DOOMer от Июль 06, 2010, 18:07
Удаление -- void QSettings::remove ( const QString & key )  тыц (http://doc.qt.nokia.com/4.6/qsettings.html#remove)

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

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

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



Название: Re: Qt and file association (Ассоциации файлов)
Отправлено: notnext от Июль 07, 2010, 08:12
Кросс-платформенного решения НЕТ! Это факт!  :'(

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

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

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


Название: Re: Qt and file association (Ассоциации файлов)
Отправлено: kuzulis от Июль 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


Название: Re: Qt and file association (Ассоциации файлов)
Отправлено: Пантер от Июль 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\"");
 


Название: Re: Qt and file association (Ассоциации файлов)
Отправлено: zenden от Июль 07, 2010, 12:04
А как вообще действуют другие приложения win при деинсталляции? Они просто удаляют ассоциации и ничего не восстанавливают?


Название: Re: Qt and file association (Ассоциации файлов)
Отправлено: notnext от Июль 07, 2010, 13:22
А как вообще действуют другие приложения win при деинсталляции? Они просто удаляют ассоциации и ничего не восстанавливают?

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

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