УЧЕБНИК ПО АВТОУСТАНОВКЕ WINDOWS

       

Создание аддона из утилиты Netlook (для новичков).


Для примера я выбрал программу Netlook. Причина заключается в желании совместить приятное с полезным - такого аддона еще нет, программка не очень большая, записей в реестр не делает (то есть практически переносная), и лично мне пригодится. Сознательно не использовались средства автоматизации создания аддона (смотрите во втором примере), чтобы пример был более наглядным. Аддон можно скачать здесь и подробно изучить.

Этап один.

После изучения структуры самой программки, я скопировал ее в отдельную папку для экспериментов и распотрошил, извлек все файлы в одну папку. Их оказалось 32 штуки. Наступило время создать собственно INF-файл. Сначала создаем заголовок.

[Version]

Signature = "$WINDOWS NT$"

SetupClass = BASE

$WINDOWS NT$ стоит использовать вместо $CHICAGO$, мы же не делаем аддон для win95? Кроме указания на базовый класс установки больше в заголовке ничего не пишем, пока и не нужно. Затем создаем самую главную секцию нашего INF-файла - исполняемую:

[DefaultInstall]

CopyFiles = CopyMain, CopyConfig, CopyHelp, CopyHist, CopyLang, CopySkin, CopySound, CopyTools, CopyInf, RenToolsLang

ProfileItems = NL.AddShortcut

Эта секция не обязательно должна иметь такое скучное имя, но поверьте от того, что она есть вам хуже не будет.

Разбираем по строчкам: CopyFiles копирует файлы, попутно создавая нужные папки, ProfileItems добавляет ярлык программы. В моем случае (хороший стиль написания INF-файла) я воспользовался уже кем-то созданной папкой по адресу Пуск\Все программы\Утилиты. На первый взгляд все выглядит просто. Но, для того чтобы создать секции копирования, которые так красиво смотрятся в строке CopyFiles=, придется попотеть-  создать все эти секции с перечислением файлов вручную. Вам никто не мешает проявить смекалку и, используя специальные утилитки, получить на руки в текстовом виде список файлов из папки куда вы их "распотрошили". Секции я поименовал в соответствии с названием папок аддона Copymain - корневая и т. д. Далее прописываем будущую структуру папок в секции [DestinationDirs].
Не буду вас утомлять и просто приведу ее:
[DestinationDirs]

CopyMain=16422, "Netlook"



CopyConfig=16422, "Netlook\Config"

CopyHelp=16422,"Netlook\Help"

CopyLang=16422,"Netlook\Languages"

CopySkin=16422,"Netlook\Skin"

CopySound=16422,"Netlook\Sound"

CopyTools=16422,"Netlook\Tools\Configurator"

RenToolsLang=16422,"Netlook\Tools\Configurator\Languages"
Здесь я поясню, почему так называется последняя секция. Оказалось, что создатель программы Netlook ничего не слышал про хороший стиль программирования и присвоил двум файлам в своей программе одинаковое имя. Вот и пришлось один из них переименовать (файлы-то лежат вместе), с тем чтобы далее, в секции [RenToolsLang] при копировании в отдельную папку, вернуть все обратно. 
[RenToolsLang]

"russian.lng",russian2.lng,,4
И последняя секция, указывающая, откуда копировать [SourceDisksNames]. Я запаковал все файлы из одной папки в CAB-архив с гордым именем netlook.cab и прописал его в INF-файле:
[SourceDisksNames]

1="NetLook Files","netlook.cab",0
Создал секцию добавления ярлыка: 
[NL.AddShortcut]

Name= "Netlook 2.3"

CmdLine= 16422,"Netlook",NetLook.exe

WorkingDir= 16422,"Netlook"

SubDir= "Утилиты"

Infotip= "Netlook 2.3"
Второй этап.


Поместив INF- и CAB-файлы рядом, я проверил, как устанавливается приложение. Хорошо устанавливается, клещами не вытянешь. На этом этапе мы и будем изобретать клещи - секции для удаления нашего приложения (uninstall). Сразу скажу, мне это далось нелегко. В теории (учебнике по INF-файлам) все выглядело просто. Указав в исполняемой секции AddReg= Секция добавления строк в реестр мы еще при установке приложения добавляем его в список установки/удаления программ. Сама секция незамысловата и подробно описана в Учебнике. Самая важная строка это

HKLM,"%Key%","DisplayName",,"Netlook 2.3"



HKLM,"%Key%","DisiplayIcon",,"16422,"Netlook",0"

HKLM,"%Key%","UninstallString",,"rundll32.exe advpack,LaunchINFSectionEx %17%\netlook.inf,NL.Uninstall"
нижняя запись, которая указывает, какую секцию выполнить в INF- файле при удалении программы. Наблюдательный человек сразу заметит, что путь к netlook.inf необычный, %17% = Windows\INF\. Для корректной отработки нам необходимо скопировать наш файл именно в эту директорию. Добавляем секции копирования  
[CopyInf]

netlook.inf
и добавляем в
[DestinationDirs]

CopyInf=17 (Знаки процента в этой секции использовать нельзя) 
Собственно секция, которая отвечает за удаление, должна выглядеть так: удаление файлов, удаление директорий, удаление записей в реестре, удаление ярлыков программы. У вас, наверняка, как и у меня, сразу мелькнула мысль: "А может просто удалить всю папку с файлами и подпапками и дело с концом?". Сразу огорчу -  не получилось. Оговорюсь, что не получилось достичь этого методами, описанными в учебнике. Есть гораздо более действенные способы. См. Приложение 2. Тонкости использования INF файлов. По итогам консультаций на форуме пришлось создавать отдельные секции удаления файлов (по сути дублирование секций COPY). Зато результат был налицо - файлы удалялись. Дальше я создал секции удаления записей в реестре (чтобы сразу после удаления программы она исчезала из списка удаления программ), удаления ярлыка и удаления директорий. Все работало замечательно. Огорчало только, то что директории не удалялись. Учебник однозначно говорит, что вызвать DelDirs проще простого:
1) Вызвать из секции деинсталяции 
Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\netlook.inf"",NL.DD,4" 
2) Затем указать в секции саму команду 
[NL.DD]

DelDirs=dirs
3) И уже в секции [dir] указать директорию, которую необходимо удалить. Не буду вас мучать, мне помогли добрые люди на форуме и средства автоматизации создания аддонов, которые мы решили здесь не рассматривать.


Оказалось, что во- первых DelDirs необходимо запускать только через RunPostSetupCommands, т. к. команда Run, которую я упорно использовал, принадлежит setupapi.dll, а DelDirs запускается через advapi.dll; во-вторых, необходимо было удалить всю структуру папок снизу. Только после этого мой скрипт заработал так, как надо.
Секции деинсталяции аддона: 
[NL.Uninstall]

DelFiles=DelCopyMain, DelCopyConfig, DelCopyHelp, DelCopyHist, DelCopyLang, DelCopySkin, DelCopySound, DelCopyTools, DelCopyInf, DelRenToolsLang

DelReg=Dreg

ProfileItems = ShortcutD

RunPostSetupCommands=NL.AdinfCall
[NL.AdinfCall]

Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\netlook.inf"",NL.DD,4"
[NL.DD]

DelDirs=dirs
[dirs]

"%16422%\Netlook\Tools\Configurator\Languages"

"%16422%\Netlook\Tools\Configurator"

"%16422%\Netlook\Tools"

"%16422%\Netlook\Sound"

"%16422%\Netlook\Skin"

"%16422%\Netlook\Languages"

"%16422%\Netlook\Help"

"%16422%\Netlook\Config"

"%16422%\Netlook"
[Dreg]

HKLM,"%Key%"
[ShortcutD]

Name  = "Netlook 2.3",0x00000002

SubDir  = "Утилиты" 
Этап третий.


Создание собственно аддона. Все, что мы делали ранее, это создание собственного инсталлятора для программы. Инсталлятор готов, можно использовать его на здоровье. Вспомним структуру аддонов и приступим. Копируем откуда-нибудь скелет аддона. Сразу же присваиваем главной папке аддона собственное имя, правим файл Addon.nfo, где пишем информацию, которую все равно никто не будет читать. Копируем в папку Files\Forcecopy CAB- и INF-файлы. Оттуда их проинтегрирует в i386 скрипт Petya V4sechkin.
Важно! Поскольку мы все делаем вручную, надо проверить папку i386 на предмет совпадений с нашими файлами, чтобы не перезаписать что-нибудь важное или просто принадлежащее системе. В любом случае при совпадениях имен система копирует свой родной файл из дистрибутива, а не "чужой".


К счастью, я нашел только нечто с именем NETLOOP.inf.
Теперь нам необходимо создать в корневой папке аддона три файла. Начнем по порядку. Сначала наш аддон будет скопирован из дистрибутива посредством Txtsetup.sif при помощи Dosnet.inf и только позднее будет обнаружен и установлен через Sysoc.inf. В такой последовательности я и предлагаю создавать файлы, не забывая о том, что в UpdatePack эти файлы без расширений. Здесь же в приложениях есть статья про Txtsetup. Поверьте, совсем не лишняя в багаже знаний.
Txtsetup 
[SourceDisksFiles]

Netlook.inf = 100,,,,,,,20,0,0

Netlook.cab = 100,,,,,,_x,,3,3
При установке INF-файл копируется в Windows\INF\, а CAB-архив не копируется, так как это наш дистрибутив.
Dosnet
[Files]

d1,Netlook.inf

d1,Netlook.cab

*здесь d1 это папка i386.
Ну и собственно,
Sysoc
Netlook=ocgen.dll,OcEntry,Netlook.inf,,7
Вроде бы все готово. Однако если подумать, то в файле Txtsetup мы не скопировали наш CAB-файл. Обязательно надо переделать секцию, указывающую на источник копирования, чтобы сообщить программе установки, где искать CAB-файл. 
[SourceDisksNames]

1="Netlook Files","netlook.cab",,"I386"
Но еще не все! Я, как и все новички, споткнулся на файле Sysoc. Запись Netlook=ocgen.dll,OcEntry,Netlook.inf,,7 означает, что будет исполнена секция [netlook] в файле netlook.inf. А моя исполняемая секция называлась DefaultInstall. Естественно, ничего не установилось. Кроме того, необходимо добавить в наш установочный файл секцию, указывающую Sysoc на то, что это "его" компонент, и команду для автоустановки аддона: 
[Optional Components]

Netlook    (указатель для sysoc на исполняемую секцию)

.....

[Netlook]

...

Modes=0,1,2,3
Также, после проверки работоспособности установщика удаляются записи о копировании INF-файла, так как Txtsetup.sif скопирует его самостоятельно.
Теперь аддон готов к интеграции в дистрибутив. Интегрируем, проверяем аддон, проверяем журнал событий и выполняем qfecheck, чтобы проверить отсутствие ошибок.
 К содержанию

Содержание раздела