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

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

Аватара для volk1234

Старовер


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

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


Обновлено руководство по написанию аддонов.
+Приложение 2. Тонкости использования inf- файлов. (в этом посте)

*Думаю это будет самый пополняемый раздел руководства. Или вообще он не в тему здесь ??

Приложение 2. Тонкости использования inf- файлов.
читать дальше »

1. DIR IDs

В руководстве по написанию INF-файлов дан наиболее полный перечень стандартных DIRID, однако по непонятной причине не
указаны специальные переменные оболочки. Привожу наиболее полный список от Gosh
Код: Выделить весь код
	Value		Shell Special Folder 

	16384 		%userprofile%\Desktop (Рабочий стол)
	16386 		%userprofile%\Start Menu\Programs (группа Программы меню Пуск)
	16389 		%userprofile%\My Documents (папка Мои документы)
	16390 		%userprofile%\Favorites (папка Избранное)
	16391 		%userprofile%\Start Menu\Programs\Startup (группа Автозагрузка)
	16392 		%userprofile%\Recent (Недавние документы)
	16393 		%userprofile%\SendTo (папка для меню Отправить)
	16395 		%userprofile%\Start Menu (меню Пуск или папка Главное меню)
	16397 		%userprofile%\My Documents\My Music (папка Моя музыка)
	16398 		%userprofile%\My Documents\My Videos (папка Мои видеозаписи)
	16400 		%userprofile%\Desktop (Рабочий стол)
	16403 		%userprofile%\NetHood (папка Сетевое окружение)
	16404 		C:\WINDOWS\Fonts (папка Шрифты)
	16405 		%userprofile%\Templates (папка Шаблоны)
            16406 *           %allusersprofile%\Start Menu
	16407 *	%allusersprofile%\Start Menu\Programs (группа Программы меню Пуск)
	16408*	%allusersprofile%\Start Menu\Programs\Startup (меню Пуск или папка Главное меню)
	16409 *	%allusersprofile%\Desktop (Рабочий стол)
            16410              %userprofile%\Application Data 
	16411 		%userprofile%\PrintHood (папка Принтеры)
	16412 		%userprofile%\Local Settings\Application Data
	16415 *	%allusersprofile%\Favorites (папка Избранное)
	16416 		%userprofile%\Local Settings\Temporary Internet Files
	16417 		%userprofile%\Cookies
	16418 		%userprofile%\Local Settings\History
	16419 *	%allusersprofile%\Application Data
	16420 		System Root (C:\WINDOWS)
	16421 		C:\WINDOWS\System32
	16422 		Program Files
	16423 		%userprofile%\My Documents\My Pictures (Мои рисунки)
	16424 		%userprofile%
	16425 		C:\WINDOWS\System32
	16427 		C:\Program Files\Common Files
	16429 *	%allusersprofile%\Templates (папка Шаблоны)
	16430 *	%allusersprofile%\Documents (папка Мои документы)
	16431 *	%allusersprofile%\Start Menu\Programs\Administrative Tools
	16432 		%userprofile%\Start Menu\Programs\Administrative Tools
	16437 *	%allusersprofile%\Documents\My Music (папка Моя музыка)
	16438 *	%allusersprofile%\Documents\My Pictures (Мои рисунки)
	16439 *	%allusersprofile%\Documents\My Videos (папка Мои видеозаписи)
	16440 		C:\WINDOWS\resources
	16441 		C:\WINDOWS\resources\0409
	16443 		%userprofile%\Local Settings\Application Data\Microsoft\CD Burning
*Для удобства выделены DIRID ссылающиеся на %allusersprofile%
NB Помните, что во время установки Windows переменная %userprofile% =%defaultuser% (других пользователей еще не существует)


2. Методы деинсталяции.

Один из проблемных моментов, корректное удаление установленного приложения.

Первое что нужно сделать это еще при установке приложения добавить наряду с другими строку для удаления приложения в реестр с указанием сеции отвечающей за деинсталяцию:
Код: Выделить весь код
HKLM,"%Key%","DisplayName",,"SOMEAPP"
HKLM,"%Key%","DsiplayIcon",,"16422,"SOMEAPP",0"
HKLM,"%Key%","UninstallString",,"rundll32.exe advpack,LaunchINFSectionEx %17%\SOMEONE.inf,Uninstall"
KLM,"%Key1%","SOMEAPP",0x00020000,"C:\Program Files\SOMEAPP\SOMEAPP.exe"
HKLM,"%Key2%","Start Minimized",0x10001,01,00,00,00
Способ 1. "По учебнику"

Используем инструкции DelDirs и DelFiles.
Код: Выделить весь код
[DefaultInstall]
CopyFiles=files

[files]
filename.ext

[DestinationDirs]
files= 11, APPDIR

;из секции деинсталяции сначала запускаем удаление всех файлов, для этого желательно
;создавать отдельную секцию со списком удаляемых файлов, хотя допустимо и использовании секции 
;со списком для копирования (если нет переименования, специальных флагов)

[Uninstall]
DelFiles=files
RunPostSetupCommand=SOMEAPP.AdinfCall
; затем запускаем через RunPostSetupCommand библиотеку advpack для обработки команды Deldirs

[SOMEAPP.AdinfCall]
Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\SOMEONE.inf"",Del.Folders,4"

[Del.Folders]
Deldirs=dirs
;передаем список директорий для удаления

[dirs]
%11%, APPDIR
NB Нужно учитывать важный момент: если не все файлы не удалены из папок, DelDirs не сработает. Если вы удаляете папку содержащую подпапки (даже пустые), DelDirs не сработает.
Так что сначала надо удалить файлы, затем подпапки "с меньшей", и только затем корневую папку приложения

Способ 2. "Радикальный"

Используется внутреняя команда библиотеки rundll32 DelNodeRunDLL32 для удаления непустых директорий.

Будем продолжать работать с предыдущим примером:
Код: Выделить весь код
[Uninstall]
DelFiles=files
RunPostSetupCommand=Del.Folders

[Del.Folders]
rundll32.exe advpack,DelNodeRunDLL32 "%11%, APPDIR"
NB Нужно учитывать важный момент: если файлы в удаляемой папке заняты системой \ выполняются, DelNodeRunDLL32 не сработает. В следующим способе вы увидите
способ решения этой проблемы через консольную команду TASK KILL.

Способ 3. "Готовый шаблон"

Данный способ предложил Jameszero.

Код: Выделить весь код
[Version]
Signature="$Windows NT$"
AdvancedINF=2.5

[Optional Components]
Programm_1

[Programm_1]
OptionDesc			=%PROG_NAME%
Tip				=%PROG_INFO%
Modes				=0,1,2,3
AddReg			=PROG.AddReg
ProfileItems			=PROG.AddShortcut

[DefaultInstall]
AddReg			=PROG.AddReg
ProfileItems			=PROG.AddShortcut

[Uninstall]
BeginPrompt			=BeginUnInsPrompt
RunPreSetupCommands	=Close.Prog:1
RunPostSetupCommands	=Dir.Delete
EndPrompt			=EndUnInsPrompt
DelReg			=PROG.DelReg
ProfileItems			=PROG.DelShortcut
DelFiles			=Del.PNF

[BeginUnInsPrompt] 
Title				=Деинсталляция %PROG_NAME%
Prompt				=Вы действительно хотите удалить %PROG_NAME% и все компоненты программы? 
ButtonType			=YESNO

[Close.Prog] 
TASKKILL /F /IM %PROG_1% 
TSKILL %PROG_2%

[Dir.Delete] 
rundll32.exe advpack.dll,DelNodeRunDLL32 %16422%\%PROG_DIR%

[EndUnInsPrompt] 
Prompt				=Программа %PROG_NAME% удалена.

[DestinationDirs]
Del.PNF			=17

[Del.PNF]
%PROG_PNF%

[PROG.AddReg]
HKLM,"%SWUninstall%\%PROG_NAME%_addon","DisplayIcon",0,"%16422%\%PROG_DIR%\%PROG_1%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","DisplayName",,%PROG_NAME%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","DisplayVersion",,"v%PROG_VERS%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","Publisher",,"%PROG_MADE%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","URLInfoAbout",,"%PROG_URL%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","UninstallString",,"rundll32.exe advpack.dll,LaunchINFSection %PROG_INF%,Uninstall"

[PROG.DelReg]
HKLM,"%SWUninstall%\%PROG_NAME%_addon"

[PROG.AddShortcut]
Name				=%SRTC_NAME%
CmdLine			=16422,%PROG_DIR%,%PROG_1%
WorkingDir			=16422,%PROG_DIR%
SubDir				=%PROG_SDIR%
InfoTip				=%PROG_INFO%

[PROG.DelShortcut]
Name				=%SRTC_NAME%,0x00000002
SubDir				=%PROG_SDIR%

[Strings] 
PROG_DIR			="Miranda IM" 
PROG_NAME			="Miranda IM"
SRTC_NAME			="Miranda IM"
PROG_VERS			="0.7"
PROG_MADE			="oszone.net"
PROG_URL			="http://forum.oszone.net/forum-62.html"
PROG_INF			="miranda.inf"
PROG_PNF			="miranda.PNF"
PROG_1			=miranda32.exe
PROG_2			=miranda32
PROG_SDIR			=""
PROG_INFO			="Программа для общения по ICQ протоколу"
SWUninstall			="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
При редактировании только одной секции [String] и переименовании секции инсталляции, можно использовать этот inf для установки/удаления других аддонов. Аддоны должны быть комбинированные, т.е. сначала из sysoc срабатывает данный inf файл, а затем из SVCPACK запускается sfx архив, созданый любым доступным способом, при этом, sfx архив должен просто распаковать файлы в нужную директорию.
Создание ярлыков, внесение информации в реестр (в том числе о деинсталляции) реализовано в inf файле.

Деинсталляция перенесена из привычного для sysoc аддонов места "Установка компонентов Windows" в Установку и удаление программ"
При деинсталляции будет выдан запрос "Вы действительно хотите удалить такую то программу?",
Если программа в данный момент запущена, она будет выгружена из памяти, далее произойдёт удаление директории с программой, ярлыков, записей реестра.
По окончании деинсталляции будет сообщено "Программа такая то удалена". Удаляется PNF-файл созданный при установке программы. PNF - файл это компилированный (pre-compilled) INF- файл, необходим один раз при установке.


3. Создание ярлыков


1.Cоздание/удаление ярлыка в контекстном меню "Отправить" (SendTo) с помощью inf

Код: Выделить весь код
[Version]
Signature="$Windows NT$"

[DefaultInstall]
ProfileItems		=PROG.AddShortcut

[Uninstall]
ProfileItems		=PROG.DelShortcut

[PROG.AddShortcut]
Name       = "Send_To_Shortcut",0x00000008,9
CmdLine    = 11,,prog.exe

[PROG.DelShortcut]
Name       = "Send_To_Shortcut",0x0000000A,9
2. Cоздание и удаление ярлыка в Quick Launch

Код: Выделить весь код
[Version]
Signature="$Windows NT$"

[DefaultInstall]
ProfileItems	=PROG.AddShortcut

[Uninstall]
ProfileItems	=PROG.DelShortcut

[PROG.AddShortcut]
Name		=%SRTC_NAME%,0x00000001
CmdLine		=16422,%PROG_DIR%,%PROG_1%
WorkingDir	=16422,%PROG_DIR%
SubDir		=%PROG_SDIR%
InfoTip		=%PROG_INFO%

[PROG.DelShortcut]
Name		=%SRTC_NAME%,0x00000003
SubDir		=%PROG_SDIR%

[Strings]
PROG_DIR	="test_dir"
SRTC_NAME	="Test_Shortcut"
PROG_1		=test.exe
PROG_SDIR	="..\..\Application Data\Microsoft\Internet Explorer\Quick Launch"
PROG_INFO	="Test_Info"
3. Cоздание и удаление ярлыка на Рабочем Столе

Код: Выделить весь код
[DefaultInstall]
ProfileItems	=PROG.AddDeskShortcut

[Uninstall]
ProfileItems	=PROG.AddDeskShortcut

[PROG.AddDeskShortcut]
Name		=%SRTC_NAME%,0x00000001
CmdLine		=16422,%PROG_DIR%,%PROG_1%
WorkingDir	=16422,%PROG_DIR%
SubDir		=%PROG_SDIR3%
InfoTip		=%PROG_INFO%

[PROG.DelDeskShortcut]
Name		=%SRTC_NAME%,0x00000003
SubDir		=%PROG_SDIR3%

[Strings]
SRTC_NAME = "Имя ярлыка"
PROG_DIR = "Путь к папке программы в Program Files"
PROG_1 = ИмяФайла.exe
PROG_INFO="Всплывающее сообщение"
PROG_SDIR3	="..\..\Рабочий стол"
Из выше приведенных примеров видно, что ярлык практически в любой локальной папке пользователя в "Documents and Settings" можно создать при помощи
пути SubDir = "..\..\Путь к папке внутри "Documents and Settings".

4. Cоздание и удаление нескольких ярлыков

Это элементарно, но некоторые пользователи все еще путаются.

Код: Выделить весь код
[DefaultInstall]
ProfileItems	=PROG.AddShortcut1, PROG.AddShortcut2, PROG.AddShortcut3

[Uninstall]
ProfileItems	=PROG.DelShortcut1, PROG.DelShortcut2, PROG.DelShortcut3

[PROG.AddShortcut1]
Name		=%SRTC_NAME1%,0x00000001
CmdLine		=16422,%PROG_DIR%,%PROG_1%
WorkingDir	=16422,%PROG_DIR%
SubDir		=%PROG_SDIR1%
InfoTip		=%PROG_INFO%

[PROG.AddShortcut2]
аналогично

[PROG.AddShortcut3]
аналогично

[PROG.DelShortcut1]
Name		=%SRTC_NAME1%,0x00000003
SubDir		=%PROG_SDIR1%

[PROG.DelShortcut2]
аналогично

[PROG.DelShortcut3]
аналогично
Важно: Пока нет профиля реального пользователя (а его нет до первого входа в систему), ярлыки имеющие флаг 0x00000001 будут создаваться в дефолтном профиле. При установке на "живой" системе, ярлык с флагом 0x00000001 будет создан только у текущего пользователя. Соответственно 0x00000003 - Удалить пункт меню (ярлык) для текущего пользователя.


4.Всяко разно

1. Cоздание папки.
Если надо просто создать пустую папку, без копирования файлов
Код: Выделить весь код
"rundll32.exe IEAKENG.dll, BToolbar_SaveA d:\Folder"
Пример использования

Код: Выделить весь код
[version]
Signature = "$CHICAGO$"
AdvancedINF=2.5

[DefaultInstall]
RunPreSetupCommands=RunPre

[RunPre]
;создаем папку backup на диске d:.
;После создания папки, экспортируем в нее reg-файл.
"rundll32.exe IEAKENG.dll, BToolbar_SaveA d:\backup"
"reg export HKLMSOFTWAREMicrosoftWindowsCurrentVersionExplorerAppKey d:\backupAppKeyBackup.reg"
Заметил интересную штуку, если писать "rundll32.exe IEAKENG.dll, BToolbar_SaveA d:Folder" без слэша и
папка Folder существует, она удаляется ! (по крайней мере в Cmd).

2.Полезные утилиты при работе с inf\cab файлами.

3.Несколько команд интерпретатора advpack не включенных в Руководство по INF- файлам.

4.Флаги ProfileItems (опять Gosh).

Есть в руководстве по INF файлам, но по этому списку более понятна логика складывания флагов:
Код: Выделить весь код
 
0x00000001 	Создать пункт меню для текущего пользователя
0x00000002 	Удалить пункт меню
0x00000003 	Удалить пункт меню для текущего пользователя
0x00000004 	Создать пункт меню для профиля All Users в папке Пуск\Все программы
0x00000005 	Создать пункт меню для профиля Current User в папке Пуск\Все программы
0x00000006 	Удалить пункт меню для профиля All Users в папке Пуск\Все программы
0x00000007 	Удалить пункт меню для профиля Current User в папке Пуск\Все программы
5. Копирование файлов из секции CopyFiles

Оказывается, раздел CopyFiles может копировать файл непосредственно в секции [DefaultInstall]!
Для этого перед файлом нужно поставить символ @. Следующий пример копирует два файла:

Код: Выделить весь код
 CopyFiles=@myfile.txt, @anotherfile.txt
6.Отображение и запуск файлов.

В процессе установки можно прервать выполнение INF файла для показа пользователю какого-нибудь документа, после закрытия которого установка продолжиться, или запустить определенный процесс. Следующий пример отображает файл справки About.hlp, текстовый файл About.txt и запускает другой INF-файл - Example.inf.
Код: Выделить весь код
[Version]
Signature=$Chicago$

[DefaultInstall]
AddReg=ExampleView

;Отображение файла справки About.hlp
[ExampleView]
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,%ABOUT%,,"WINHLP32.EXE - Main %1%\About.hlp"

;Отображение текстового файла About.txt
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,%ABOUT%,,"notepad %1%\About.txt"

;Запуск файла сценария Example.inf
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,%ABOUT%,,"rundll setupx.dll,InstallHinfSection DefaultInstall 132 %1%\Example.inf"

;Определяете название, которое будет отображатся в
;окне "Установка Windows..."
[Strings]
ABOUT="О программе ..."
После того, как определенные в секции [ExampleView] команды выполнятся, записи, добавленные в реестр, будут автоматически удалены из него. Таким способом можно запускать и другие процессы, например, аплеты Панели управления:
Код: Выделить весь код
;Запуск апплета Панели управления - Свойства: Система (SYSDM.CPL)
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,%ABOUT%,,"rundll32 shell32,Control_RunDLL SYSDM.CPL"

7. Копирование одного и того же файла в разные папки.

Код: Выделить весь код
[DestinationDirs]
File.Copy=16422,"Prog"
FileYet.Copy=16422,"Prog\Subdir"

[File.Copy]
filename.dll,,,4 

[FileYet.Copy]
filename.dll,,,4



-------

Ю-ху!


Последний раз редактировалось volk1234, 23-07-2008 в 12:21. Причина: добавление информации

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

Отправлено: 03:01, 14-04-2008 | #109