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  ls