Текст автора сохранен. Перед разбором примера скачайте исходники .
Перед прочтением данного материала настоятельно рекомендуется ознакомиться с Руководством по работе с INF-файлами. В нём вы найдёте ответы на большинство возникающих вопросов.
Разберём пример создания аддона Punto Switcher (в дальшейшем PS). Я выбрал его для рассмотрения потому, что несмотря небольшой объём аддона, в нём присутствуют как секции копирования/деинсталляции файлов, так и секции добавления/удаления записей в реестр, ярлыков, регистрация/дерегистрация библиотек. Этих знаний вполне достаточно для изготовления 90% аддонов.
Проведение предварительной подготовки аддона доверим скрипту для создания секций копирования/удаления от XXXler. Создаём пустую папку, в которой хотим получить аддон. Назовём её, к примеру, Punto_sw. Запустив скрипт, выбираем в качестве исходной папку с файлами PS и заполняем поля:
- Корневая папка – путь, куда будет установлена программа, в данном случае Program Files (перед ней стоит её цифровое обозначение согласно dirids)
- Подкаталог – папка, которая будет создана в Program Files (C:\Program Files\Punto Switcher\)
- Название – имя программы в «Установке компонентов Windows»
- Подсказка – дополнительная информация при выборе программы в «Установке компонентов Windows»
- Иконка – иконка, которая будет отображена возле программы в «Установке компонентов Windows»
- Имя секции – идентификатор программы в системе (рекомендуемое имя до 8-и символов)
Нажимаем «Cоздать» и выбираем созданную на первом этапе папку Punto_sw. Ждём пару секунд, пока не откроется созданный INF-файл для дальнейшей, уже ручной, работы с ним.
Дальнейшая работа производится в любом текстовом редакторе.
1. Секция [punto_sw] приводится к следующему виду
[punto_sw]
OptionDesc="Punto Switcher"
Tip="Переключатель раскладок"
Modes=0,1,2,3
CopyFiles=punto_sw.Copy
;AddReg=Секции добавления в реестр
;DelReg =
;UnRegisterDlls=Секции регистрации библиотек
;ProfileItems=Секции создания ярлыков
SizeApproximation=502755
Uninstall=punto_sw.Uninstall
RegisterDlls меняем на UnRegisterDlls и добавляем DelReg (об этом ниже).
2. Приступаем к секции внесения записей в реестр.
Оговорюсь сразу, что разделы реестра, которые необходимо учитывать при изготовлении конкретного аддона, можно определить несколькими способами. Существуют специализированные программы для отслеживания обращения к реестру, но в данном материале я не буду заострять на этом внимание.
Все настройки программы хранятся по пути HKCU,"Software\Punto Switcher\2.5". Автозапуск PS происходит из HKCU,"Software\Microsoft\Windows\CurrentVersion\Run". Необходимо настроить установленный PS по своему усмотрению, экспортировать вышеназванные ветки реестра и конвертировать их в INF-формат (на этом останавливаться не будем, необходимая информация есть в шапке темы Авторам аддонов.
Возвращаемся к INF-файлу аддона. В его секции [punto_sw] находим строчку ;AddReg=Секции добавления в реестр. Снимаем комментарий «;» и присваиваем ей значение, например, punto_sw.AddReg (значение может быть любым, точка перед AddReg, как и само буквосочетание AddReg не обязательны, важно чтобы имя было уникальным в листинге INF-файла)
Получаем следующее:
[punto_sw]
OptionDesc="Punto Switcher"
Tip="Переключатель раскладок"
Modes=0,1,2,3
CopyFiles=punto_sw.Copy
AddReg= punto_sw.AddReg
;DelReg =
;UnRegisterDlls=Секции регистрации библиотек
;ProfileItems=Секции создания ярлыков
SizeApproximation=502755
Uninstall=punto_sw.Uninstall
В дальнейшем, я не буду подробно останавливаться на редактировании строк «шапки» INF-файла. Создаём в INF-файле соответствующую секцию [punto_sw.AddReg] (название её должно совпадать со значением директивы AddReg). Я привожу секцию из реального аддона (у вас она может отличаться в зависимости от ваших настроек программы).
[punto_sw.AddReg]
HKCU,"Software\Microsoft\Windows\CurrentVersion\Run","Punto Switcher",,"%16422%\Punto Switcher\ps.exe"
HKCU,"Software\Punto Switcher\2.5","Options",1,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,33,4c,37,44,31,38,63,\
67,00,00,00,00,56,e8,df,45,00,01,01,00,01,00,00,01,01,01,00,00,00,01,00,00,\
01,01,00,00,00,00,01,00,00,01,00,01,01,00,00,00,00,01,00,00,00,01,00,00,00,\
01,00,00,00,00,00,00,2c,01,00,00,2c,01,00,00,64,00,00,00,64,00,00,00,f4,01,\
00,00,5e,01,00,00,01,01,01,00,00,01,01,00,01,00,00,00,02,00,00,00
HKCU,"Software\Punto Switcher\2.5","Sound_0",,"%16422%\Punto Switcher\typerus.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_1",,"%16422%\Punto Switcher\typeeng.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_2",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_3",,"%16422%\Punto Switcher\misprint.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_4",,"%16422%\Punto Switcher\ru.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_5",,"%16422%\Punto Switcher\en.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_6",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_7",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_8",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_9",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_10",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_11",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_12",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_13",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_14",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_15",,"%16422%\Punto Switcher\replace.wav"
HKCU,"Software\Punto Switcher\2.5","SoundState_0",0x10001,03,00,dc,05
HKCU,"Software\Punto Switcher\2.5","SoundState_1",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_2",0x10001,03,00,c4,09
HKCU,"Software\Punto Switcher\2.5","SoundState_3",0x10001,03,00,bc,02
HKCU,"Software\Punto Switcher\2.5","SoundState_4",0x10001,03,00,e8,03
HKCU,"Software\Punto Switcher\2.5","SoundState_5",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_6",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_7",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_8",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_9",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_10",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_11",0x10001,03,00,dc,05
HKCU,"Software\Punto Switcher\2.5","SoundState_12",0x10001,03,00,a4,06
HKCU,"Software\Punto Switcher\2.5","SoundState_13",0x10001,03,00,6c,07
HKCU,"Software\Punto Switcher\2.5","SoundState_14",0x10001,03,00,f4,01
HKCU,"Software\Punto Switcher\2.5","SoundState_15",0x10001,03,00,90,01
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce","msimtf",0x20000,"regsvr32.exe /s /u %11%\msimtf.dll"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce","msctf",0x20000,"regsvr32.exe /s /u %11%\Msctf.dll"
О двух последних строчках я расскажу ниже при рассмотрении дерегистрации библиотек. Поскольку PS предназначен для замены стандартного переключателя раскладок клавиатуры, то стандартный (CTFMON.EXE) в автозагрузке нам не нужен. Его запуск в системе происходит через реестр, и эти сточки необходимо удалить. Создаём в «шапке» INF-файла директиву DelReg = CTF.DelReg и пишем в INF-файле:
[CTF.DelReg]
HKLM,"Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE"
HKCU,"Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE"
HKU,".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE"
3. Директива создания ярлыков - ProfileItems
Редактируем её в «шапке» INF-файла таким образом: ProfileItems = punto_sw.AddShortcut. Затем создаём в INF-файле секцию [punto_sw.AddShortcut].
[punto_sw.AddShortcut]
Name = "Punto Switcher 2.9"
CmdLine = 16422,"Punto Switcher" ps.exe
SubDir = "Punto Switcher"
WorkingDir = 16422,"Punto Switcher"
Name – имя ярлыка
CmdLine – путь к исполняемому файлу (строка расшифровывается, как C:\Program Files\ Punto Switcher\ps.exe)
SubDir – подпапка в меню «Программы» (Пуск\Программы\Punto Switcher\) эта строчка может отсутствовать, тогда ярлык будет создан в Пуск\Программы\
WorkingDir – рабочая директория (C:\Program Files\ Punto Switcher\)
Для многих простейших аддонов вышеописанной информации достаточно, но в случае с PS необходимо также рассмотреть дерегистрацию файлов стандартного переключателя раскладок. Если это не выполнить, то CTFMON.EXE будет заново прописан системой в автозагрузку.
4. Дерегистрация библиотек
Создаём в «шапке» строчку UnRegisterDlls = CTF.UnRegister а в INF-файле прописываем:
[CTF.UnRegister]
11,,msimtf.dll
11,,Msctf.dll
Цифра 11, согласно dirids, означает, что файл находится в System32. Если бы файл находился, скажем, в Windows, то строчки выглядели бы таким образом - 10,,msimtf.dll. Возможна ситуация, когда файл находится, например, в Program Files\Prog1\file.dll, в таком случае отмена регистрации выглядела бы так: 16422,Prog1,file.dll
И вернёмся к двум последним строчкам нашей секции AddReg:
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce","msimtf",0x20000,"regsvr32.exe /s /u %11%\msimtf.dll"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce","msctf",0x20000,"regsvr32.exe /s /u %11%\Msctf.dll"
Они, по сути, также выполняют дерегистрацию библиотек, но уже после перезагрузки, в данном случае в момент времени Т13. Двойная отмена регистрации необходима только в конкретном аддоне, потому что система регистрирует msimtf.dll и Msctf.dll заново, а в большинстве случаев достаточно однократной дерегистрации.
5. Теперь приступим к секциям деинсталляции аддона.
Для PS недостаточно удалить только файлы – необходимо так же восстановить работу стандартного переключателя раскладок. В процессе удаления будет участвовать секция [punto_sw.Uninstall] и дальше по тексту, теперь её будем именовать «шапкой». Итак, редактируем «шапку» следующим образом:
[punto_sw.Uninstall]
DelFiles = punto_sw.Del
ProfileItems = punto_sw.DelShortcut
DelReg = punto_sw.DelReg
AddReg = CTFMON.Restore
RegisterDlls = CTF.dll.Restore
С директивой DelFiles понятно – она вызовет соответствующую секцию со списком удаляемых файлов. ProfileItems – удаляет ярлык, но секции удаления ярлыков несколько отличаются от секций создания. Здесь всё просто - достаточно указать имя ярлыка и подпапку, в которой он находится.
Приведу пример удаления того же ярлыка, который мы рассматривали в создании.
[punto_sw.DelShortcut]
Name = "Punto Switcher 2.9",0x00000002
SubDir = "Punto Switcher"
Далее в «шапке» INF-файла идут уже знакомые директивы AddReg и DelReg, а так же директива RegisterDlls, которая восстановит регистрацию файлов msimtf.dll и Msctf.dll. Секции будут выглядеть так:
[punto_sw.DelReg]
HKCU,"Software\Microsoft\Windows\CurrentVersion\Run","Punto Switcher"
HKCU,"Software\Punto Switcher"
[CTFMON.Restore]
HKCU,"Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE",,"%11%\ctfmon.exe"
HKU,".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE",,"%11%\CTFMON.EXE"
[CTF.dll.Restore]
11,,msimtf.dll,1
11,,Msctf.dll,1
Удаление записей реестра, так же как и ярлыков, отличается от добавления в реестр. Необходимо указать только корневой раздел, в данном случае, HKCU,"Software\Punto Switcher", и она будет удалена со всем подразделами. Секцией [CTFMON.Restore] мы восстанавливаем в автозагрузке стандартный переключатель раскладок, а в секции [CTF.dll.Restore] регистрируем связанные с ним библиотеки.
Следущие секции участвуют в деинсталляции аддона.
[punto_sw.AdvInfCall]
Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\punto_sw.inf"",punto_sw.Uninstal.DelDirs,4"
TickCount=500
[punto_sw.Uninstal.DelDirs]
DelDirs=punto_sw.DelDirs
[punto_sw.DelDirs]
"%16422%/Punto Switcher"
На этом подробно останавливаться не будем, их вполне корректно создаёт Скрипт для создания секций копирования/удаления файлов, с которого мы начали изготовление аддона.
Аддон готов. Чтобы привести его к привычному виду, нужно удалить файлы PreCompile.exe, PreCompile.lst и папку src. Переименовать файл upd в upd.cmd и запустить.
Общие замечания:
- Я не делал привязку аддона к 3rdParty, чтобы упростить описание.
- При установке/удалении аддона необходима перезагрузка компьютера, но автоматизацию этого процесса я рассматривать не стал. Посмотрите, как это реализовано в аддоне DrWeb (при установке/удалении SpiderGuard из компонентов Windows запрашивается перезагрузка).
- В секции копирования файлов рассмотренного аддона вы встретите такие строчки:
correct.dll,,,4
"ChooseLayouts.exe",ChooseLa.exe,,4
Первая копирует файл correct.dll в директорию назначения в таком же виде, в каком он находится в CAB-архиве аддона, а вторая читается так: скопировать файл ChooseLa.exe в директорию назначения и переименовать его в ChooseLayouts.exe. Это сделано для соответствия имён файлов в CAB-архиве формату 8.3.
- Если путь к папке или файлу содержит пробелы, не забывайте заключать его в кавычки.
Пример был взят отсюда.
К содержанию