Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314

Профиль | Отправить PM | Цитировать


Пример создания аддона из утилиты 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(Знаки процента в этой секции использовать нельзя)
Вот так вот.
Собственно секция которая отвечает за удаление должна выглядеть так: удаление файлов, удаление директорий, удаление записей в реестре, удаление ярлыков программы. У вас, наверняка, как и у меня сразу мелькнула мысль, а может просто удалить всю папку с файлами и подпапками, и дело с концом? Сразу огорчу, не получилось. Оговорюсь, не получилось методами описанными в учебнике. Есть гораздо более действенные способы.
В результате консультаций на форуме, пришлось создавать отдельные секции удаления файлов (по сути дубляж секций 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, а DelDirs запускается через advapi; во-вторых необходимо было прибить всю структуру папок снизу. Только после этого мой скрипт заработал как надо.

Секции деинсталяции аддона
Код: Выделить весь код
[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.

Теперь нам необходимо создать в корневой папке аддона 3 файла. Начнем по порядку. Сначала наш аддона будет скопирован из дистрибутива
посредством 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 на отсутствие наличия ошибок.

-------

Ю-ху!


Последний раз редактировалось volk1234, 07-04-2008 в 16:53.

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:17, 18-03-2008 | #474