Ассоциация файлов с программой
Сегодня разберем пример ассоциации файлов с программой. В 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 по умолчанию не знает.
Code (Assembler) : Убрать нумерацию
- SHCNE_ASSOCCHANGED = 0x8000000
- SHCNF_IDLIST = 0
- szKey1 db '.pcl',0
- szVal1 db 'MyApplication',0
- szKey2 db 'MyApplication\DefaultIcon',0
- szKey3 db 'MyApplication\Shell\Open\command',0
- szNull db 0
- szIcon db ',0',0
- szOpen db '" "%1"',0
- phkResult dd ?
- lpdwDisp dd ?
- buff rb 500
Code (Assembler) : Убрать нумерацию
- ; Регистрируем расширение .pcl
- invoke RegCreateKeyEx,HKEY_CLASSES_ROOT,szKey1,0,0,\
- REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
- invoke lstrlen,szVal1
- invoke RegSetValueEx,[phkResult],szNull,0,REG_SZ,szVal1,eax
- ; Ассоциация с иконкой
- invoke RegCreateKeyEx,HKEY_CLASSES_ROOT,szKey2,0,0,\
- REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
- invoke GetModuleFileName,NULL,buff,MAX_PATH
- invoke lstrcat,buff,szIcon
- invoke lstrlen,buff
- invoke RegSetValueEx,[phkResult],szNull,0,REG_SZ,buff,eax
- ; Ассоциация с программой для запуска
- invoke RegCreateKeyEx,HKEY_CLASSES_ROOT,szKey3,0,0,\
- REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
- mov byte [buff],'"'
- invoke GetModuleFileName,NULL,buff+1,MAX_PATH
- invoke lstrcat,buff,szOpen
- invoke lstrlen,buff
- invoke RegSetValueEx,[phkResult],szNull,0,REG_SZ,buff,eax
Code (Assembler) : Убрать нумерацию
- ; Удаляем зарегистрированное расширение и ассоциацию с приложением
- invoke SHDeleteKey,HKEY_CLASSES_ROOT,szKey1
- invoke SHDeleteKey,HKEY_CLASSES_ROOT,szVal1
Code (Assembler) : Убрать нумерацию
- ; Применяем изменения в системе
- invoke SHChangeNotify,SHCNE_ASSOCCHANGED,SHCNF_IDLIST,NULL,NULL
В приложении пример программы с исходным текстом, которая связывает расширение ".PCL" со своим исполняемым файлом, а также удаляет созданную связку.
Просмотров: 1743 | Комментариев: 1
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
BIOnik
(18.07.2018 в 05:06):
Коротко, доходчиво и по делу. Спасибо!
Добавить комментарий
Заполните форму для добавления комментария