Russian Qt Forum

Qt => Общие вопросы => Тема начата: gil9red от Август 19, 2012, 16:30



Название: Регистрация в ОС новых форматов + связь их с программой
Отправлено: gil9red от Август 19, 2012, 16:30
Здравствуйте!
пишу на C++ Qt
есть программа, у программы есть собственный формат файла, который она использует при сохранении и загрузки данных

в винде: такой формат файлов имеет иконку как у программы, к которой ее привязали
при открытии такого файла открывается программа, привязанная к файлу
Наглядный пример: офис ворд

как можно привязать свой формат файлов к программе?
можно и просто для винды :)

Просто никогда этим не занимался и не знаю даже как правильно в гугль вбить описание своего вопроса ;D


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: MoPDoBoPoT от Август 19, 2012, 16:55
Windows, Ассоциации файлов (http://www.prog.org.ru/topic_17545_0.html)


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: gil9red от Август 19, 2012, 17:21
Спасибо :)


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: kambala от Август 19, 2012, 17:58
недавно сам прикручивал ассоциацию файлов к приложению (винда и мак ос), выкладываю почти готовый к употреблению класс. несколько замечаний:
  • описание файла и программы жёстко зашиты в код (fileassociationmanager_win.cpp строки 39 и 66 соответственно), так что их желательно поменять :)
  • в файле helpers.h лишь объявлены макросы для вывода месседжбоксов (например ERROR_BOX_NO_PARENT()), поэтому его не выкладываю, а их вызовы можно просто стереть
  • поддержка Windows Vista и выше присутствует
  • чтобы на Windows 7 ассоциации обновлялись, надо сначала задать application user model id (например при запуске приложения):
Код
C++ (Qt)
static const QString kMyExtension(".ext");
 
#ifdef WIN_7_OR_LATER
typedef HRESULT (__stdcall *PSCPEAUMID)(PCWSTR); // SetCurrentProcessExplicitAppUserModelID()
#endif
 
PCWSTR appUserModelID()
{
   static const QString progId = FileAssociationManager::progIdForExtension(kMyExtension);
   return progId.utf16();
}
 
MyMainWidget::MyMainWidget(QWidget *parent) : QWidget(parent)
{
#ifdef WIN_7_OR_LATER
   PSCPEAUMID pSetCurrentProcessExplicitAppUserModelID = (PSCPEAUMID)GetProcAddress(GetModuleHandle(L"shell32.dll"), "SetCurrentProcessExplicitAppUserModelID");
   if (pSetCurrentProcessExplicitAppUserModelID)
       pSetCurrentProcessExplicitAppUserModelID(appUserModelID());
#endif
}


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: Igors от Август 19, 2012, 20:22
"Мишке там сказали нет - ну а мне пожалуйста"  :)

kambala, спасибо! У меня как раз была эта мелкая но противная проблемка - др приложение перебивает мое extension. И я все оттягивал неприятный момент гугления и рыскания в нативняке. И не зря - перевел Ваш код на плюсы - вроде бычит, во всяком случае в Finder все гуд 


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: kambala от Август 20, 2012, 00:21
пожалуйста
перевел Ваш код на плюсы
я так понимаю переводить пришлось только функцию NSStringFromQString в CFStringRefFromQString? :)


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: Igors от Август 20, 2012, 12:33
я так понимаю переводить пришлось только функцию NSStringFromQString в CFStringRefFromQString? :)
Ну да  :)


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: gil9red от Август 22, 2012, 17:26
Спасибо, kambala, посмотрю ваш код на досуге :)


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: gil9red от Август 22, 2012, 18:12
Получается у виндоус хр и висты/7 ассоциация файлов в реестре разная?


Название: Re: Регистрация в ОС новых форматов + связь их с программой
Отправлено: kambala от Август 22, 2012, 20:22
для висты и выше там добавились некоторые новые фичи, которые желательно использовать, но ХР-подход также работает. но все равно большая часть кода для обоих систем одинакова — QSysInfo я использую всего пару раз.