Blog. Just Blog

Ассоциация файлов с программой

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем пример ассоциации файлов с программой. В Windows это один из краеугольных камней работы системы. С определенным расширением файлов связана та или иная программа. При клике на документе открывается Word, при открытии html-документа запускается браузер, картинки открываются в просмотрщике, а файлы проектов различных программ открываются в этих программах. Это хорошо и правильно.

Для установки связки определенного расширения файлов со своей программой, сперва надо придумать название типа. Для примера, пусть это будет "MyApplication". Затем в ветке реестра HKEY_CLASSES_ROOT надо создать ключ, соответствующий нужному расширению и присвоить значение параметра по умолчанию, равное придуманному имени.

[HKEY_CLASSES_ROOT\.pcl]
@="MyApplication"

Если программа работает с несколькими расширениями файлов, то для каждого из них точно так же надо прописать ассоциацию с типом "MyApplication".

Теперь надо настроить программу, соответствующую типу "MyApplication". Сперва создается ключ в реестре "HKEY_CLASSES_ROOT\MyApplication". Затем нужно настроить иконку, которая будет отображаться в Проводнике у всех связанных файлов. За это отвечает ключ реестра "HKEY_CLASSES_ROOT\MyApplication\DefaultIcon". В этом примере файлы будут иметь иконку, которая назначена в ресурсах приложения в качестве основной.

[HKEY_CLASSES_ROOT\MyApplication\DefaultIcon]
@="D:\\DEMO\\association.exe,0"

При запуске связанной программы ей в качестве параметра должен передаваться полный путь к файлу, который открывается. Делается это настройкой ключа реестра "MyApplication\Shell\Open\command".

[HKEY_CLASSES_ROOT\MyApplication\Shell\Open\command]
@="\"D:\\DEMO\\association.exe\" \"%1\""

Для отмены ассоциаций достаточно удалить ключи "HKEY_CLASSES_ROOT\MyApplication" и "HKEY_CLASSES_ROOT\.pcl". Вот и вся премудрость.

Осталось оформить теорию в виде кода. В сегменте данных определим все необходимые ключи и их значения, а также несколько констант, которые FASM по умолчанию не знает.
  1. SHCNE_ASSOCCHANGED = 0x8000000
  2. SHCNF_IDLIST = 0
  3.  
  4. szKey1  db '.pcl',0
  5. szVal1  db 'MyApplication',0
  6. szKey2  db 'MyApplication\DefaultIcon',0
  7. szKey3  db 'MyApplication\Shell\Open\command',0
  8. szNull  db 0
  9. szIcon  db ',0',0
  10. szOpen  db '" "%1"',0
  11.  
  12. phkResult dd ?
  13. lpdwDisp dd ?
  14.  
  15. buff       rb 500
Установка ассоциации файлов с программой:
  1.         ; Регистрируем расширение .pcl
  2.         invoke  RegCreateKeyEx,HKEY_CLASSES_ROOT,szKey1,0,0,\
  3.                 REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
  4.         invoke  lstrlen,szVal1
  5.         invoke  RegSetValueEx,[phkResult],szNull,0,REG_SZ,szVal1,eax
  6.  
  7.         ; Ассоциация с иконкой
  8.         invoke  RegCreateKeyEx,HKEY_CLASSES_ROOT,szKey2,0,0,\
  9.                 REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
  10.         invoke  GetModuleFileName,NULL,buff,MAX_PATH
  11.         invoke  lstrcat,buff,szIcon
  12.         invoke  lstrlen,buff
  13.         invoke  RegSetValueEx,[phkResult],szNull,0,REG_SZ,buff,eax
  14.  
  15.         ; Ассоциация с программой для запуска
  16.         invoke  RegCreateKeyEx,HKEY_CLASSES_ROOT,szKey3,0,0,\
  17.                 REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
  18.         mov     byte [buff],'"'
  19.         invoke  GetModuleFileName,NULL,buff+1,MAX_PATH
  20.         invoke  lstrcat,buff,szOpen
  21.         invoke  lstrlen,buff
  22.         invoke  RegSetValueEx,[phkResult],szNull,0,REG_SZ,buff,eax
Удаление ассоциации файлов:
  1.         ; Удаляем зарегистрированное расширение и ассоциацию с приложением
  2.         invoke  SHDeleteKey,HKEY_CLASSES_ROOT,szKey1
  3.         invoke  SHDeleteKey,HKEY_CLASSES_ROOT,szVal1
После установки связки или ее удаления требуется оповестить систему о внесенных изменениях. Делается это следующей командой:
  1.         ; Применяем изменения в системе
  2.         invoke   SHChangeNotify,SHCNE_ASSOCCHANGED,SHCNF_IDLIST,NULL,NULL
Проводник обновит отображение файлов, в случае установки ассоциации связанные файлы будут иметь иконку приложения, а если связка удалена, то они будут отображаться с дефолтной иконкой.

В приложении пример программы с исходным текстом, которая связывает расширение ".PCL" со своим исполняемым файлом, а также удаляет созданную связку.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

File.Association.Demo.zip (3,457 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 459 | Комментариев: 1

Комментарии

Отзывы посетителей сайта о статье
BIOnik (18.07.2018 в 05:06):
Коротко, доходчиво и по делу. Спасибо!

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2018
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.003 сек.) / Память: 4.75 Mb
Наверх