Книга "Недокументированные возможности Windows XP. Библиотека пользователя", Глава 4. Другие возможности Windows XP. Часть 5. Inf-файлы, продолжение.
Копирование файлов Копирование файлов реализовано в inf-файлах наиболее сложно. Для выполнения копирования необходимо не только использовать ключевое слово COPYFILES, но и создавать три отдельных блока inf-файла: DESTINATIONDIRS, SOURCEDISKSFILES и SOURCEDISKSNAMES. Давайте рассмотрим простой пример.
В этом примере для описания копируемых файлов используется блок inf-файла [infcopy], ссылка на которых содержится в ключевом слове COPYFILES. Этот блок содержит в себе только названия файлов, которые должны быть скопированы (если файлов несколько, тогда каждый из них пишется в отдельной строке). Кроме блока [infcopy] файл обязательно должен содержать в себе и три других стандартных блока inf-файлов.
Блок [DESTINATIONDIRS] определяет каталоги, в которые должны копироваться файлы, описанные в отдельных блоках inf-файла, предназначенных для описания копируемых файлов. При этом, все файлы, описанные в одном блоке inf-файла, должны копироваться только в один каталог (то есть, если бы в нашем блоке [INFCOPY] описывалось два файла, например, 1.inf и 2.inf, тогда оба этих файла будут копироваться в один каталог). Формат определения каталога, в который будут копироваться файлы, следующий: «блок описания
копируемых файлов»=«числовой номер каталога»,«дальнейший путь к каталогу». Числовой номер каталога представляет собой число, идентифицирующее одну из системных папок. Давайте рассмотрим некоторые из этих чисел, а также каталоги, которые они определяют.
10 — %systemroot%.
11 — %systemroot%\system32.
17 — %systemroot%\Inf.
53 — %userprofile%.
54 — %systemdrive%.
1 — говорит о том, что необходимо использоваться абсолютный путь, который должен быть записан после числового номера (через запятую). Абсолютным путем называется путь, который не начинается с числового номера каталога. Например, числовым путем является путь d:\test\1.
С помощью блока [SOURCEDISKSFILES] осуществляется присваивание каждому копируемому файлу уникального идентификатора, который будет определять в блоке [SOURCEDISKSNAMES] название диска, из которого выполняется копирование файла. Формат строк этого блока следующий: «название копируемого файла»=«уникальный идентификатор диска, на котором находится этот файл».
Блок [SOURCEDISKSNAMES] определяет диски, на которых находятся копируемые файлы. Формат строк этого блока таков: «уникальный идентификатор диска»=«имя диска»,«метка диска»,«серийный номер диска». Метка диска отображается в диалоге копирования файлов. Также эта метка отображается в диалоге, выводимом если система не может найти указанные для копирования файлы. В этом случае система попросит вас вставить диск, название которого как раз и указано в блоке [SOURCEDISKSNAMES].
Удаление файлов Удаление файлов напоминает их копирование, поэтому мы рассмотрим этот процесс лишь поверхностно — в подсказках к листингу 4.8. Для определения блоков, содержащих описания удаляемых файлов, используется ключевое слово DELFILES.
Листинг 4.8. Удаление файлов
[version]
Signature = $CHICAGO$
;данный подраздел будет вызываться с помощью команды rundll32
[DefaultUninstall]
DelFiles = infdel
;мы будем удалять файл vfolder.inf
[infdel]
vfolder.inf
;теперь данный блок указывает не каталог, в который копируются файлы,
;а каталог, из которого удаляются файлы, описанные в блоке
[DestinationDirs]
infdel = 17
[SourceDisksFiles]
vfolder.inf = 55
[SourceDisksNames]
55 = "имя диска", , 1
Создание ярлыка на файл с меню Пуск Это еще одна возможность, которой можно воспользоваться при помощи inf-файла. С помощью ключевого слова PROFILEITEMS можно определить блок inf-файла, с помощью которого описывается создаваемый в меню ПУСК ярлык. Давайте рассмотрим пример, с помощью которого создается ярлык на программу ВОССТАНОВЛЕНИЕ СИСТЕМЫ в меню ПУСК (СТАНДАРТНЫЕ/СЛУЖЕБНЫЕ).
Листинг 4.9. Создание ярлыка
[version]
Signature="$CHICAGO$"
[DefaultInstall]
ProfileItems=SRProfile
[SRProfile]
Name="Восстановление системы"
CmdLine=11,restore,rstrui.exe
SubDir="Стандартные\Служебные"
InfoTip="Это подсказка, отображаемая при наведении указателя на ярлык"
DisplayResource="%systemroot%\system32\restore\rstrui.exe",2048
ProfileItems=SRProfile
Блок для описания ярлыка в меню ПУСК может содержать в себе следующие ключевые слова.
Name — определяет название создаваемого в меню ПУСК ярлыка.
CmdLine — определяет путь к программе, для которой создается ярлык. Формат данного ключевого слова немного необычен: «числовой путь к стандартному каталогу, размещение файла, название файла».
SubDir — определяет расположение ярлыка в меню ПУСК. Если точнее, тогда данное ключевое слово определяет дальнейший путь к каталогу, который будет содержать ярлык на программу. Дальнейший путь добавляется к пути %systemdrive%\Documents and Settings\All Users\Главное меню\Программы.
WorkingDir — определяет рабочие каталоги для программы, на которую создается ярлык (как правило, это ключевое слово не указывается).
INFOTIP — определяет подсказку, отображаемую при наведении указателя на созданный в меню ПУСК ярлык.
Расширенные inf-файлы Расширенные inf-файлы отличаются от обычных одной строкой, которую нужно добавить в блок [VERSION]. Например, ниже приведен пример блока версии для расширенного inf-файла.
[Version]
Signature="$CHICAGO$"
AdvancedINF=2.5, "Эта строка будет выводится, если на компьютере не найдено библиотеки advpack.dll "
Также для работы с расширенными inf-файлами необходима библиотека advpack.dll, по умолчанию расположенная в каталоге %systemroot%. Если перед началом выполнения расширенного inf-файла система не найдет данной библиотеки, тогда она выведет сообщение, указанное в ключевом слове AdvancedINF после запятой. К тому же, как мы знаем, расширенные inf-файлы вызываются с помощью команды rundll32.exe ADVPACK.dll, LaunchINFSectionEx «имя файла», «имя раздела», «имя cab-файла», «флаг».
Тогда как обычные inf-файлы вызываются с помощью команды rundll32.exe setupapi.dll, InstallHinfSection «раздел в файле для начала установки», «флаг», «путь и имя файла».
Запуск программ до и после установки Расширенные inf-файлы поддерживают такую возможность, как запуск команд перед или после установки inf-файла. При этом для указания блока, описывающего программы, запускаемые перед установкой inf-файла, используется ключевое слово RUNPRESETUPCOMMANDS. А для указания блока, описывающего программы, запускаемые после установки inf-файла, используется ключевое слово RUNPOSTSETUPCOMMANDS. Давайте посмотрим на пример использования этих ключевых
слов.
Листинг 4.10. Запуск программ до и после установки inf-файла
[version]
Signature = $CHICAGO$
AdvancedINF=2.5, "Эта строка будет выводится, если на компьютере не найдено библиотеки advpack.dll "
[DefaultInstall]
RunPreSetupCommands=RunPre
RunPostSetupCommands=RunPost
[RunPre]
calc.exe
cmd.exe
[RunPost]
"rundll32.exe IEAKENG.dll, DoReboot"
Приведенный на листинге inf-файл перед своей установки вызывает калькулятор Windows, а потом вызывает стандартный командный интерпретатор Windows. После же свей установки он вызовет диалоговое окно с вопросом о перезагрузке компьютера. Конечно, диалоговое окно с вопросом о перезагрузке принадлежит Internet Explorer, но зато оно работает.
Вопрос о перезагрузке компьютера можно было вызвать и с помощью флагов вызова inf-файла, но в листинге мы специально использовали команды rundll32.
Не забывайте также, что данный inf-файл не выполнится после выбора команды УСТАНОВИТЬ из контекстного меню inf-файла. Для его установки придется воспользоваться командой RunDll32 advpack.dll, LaunchINFSection d:\1.inf, DefaultInstall. Где d:\1.inf соответствует пути к Inf-файлу и его названию.
Вывод сообщения перед установкой Также перед или после установки inf-файла можно вывести окно сообщения с произвольным текстом. Диалог сообщения, выводимый перед установкой, позволяет эту установку отменить. Он содержит в себе две кнопки ОК и ОТМЕНА. Если нажать на кнопку ОТМЕНА, тогда установка inf-файла будет отменена. Диалог сообщения, выводимый после установки, является информационным и содержит только одну кнопку — ОК.
Чтобы вывести диалоговое окно перед установкой, необходимо воспользоваться ключевым словом BEGINPROMPT (окно сообщения будет выведено до вызова программ, описанных ключевым словом RUNPRESETUPCOMMANDS), а чтобы вывести окно сообщения после установки, необходимо воспользоваться ключевым словом BEGINPROMPT. В листинге 4.11 приведен простой пример использования как окна сообщения, выводимого перед установкой, так и окна сообщения, выводимого после установки.
Листинг 4.11. Вывод окна с произвольным текстом
[version]
Signature = $CHICAGO$
AdvancedINF=2.5, "Эта строка будет выводится, если на компьютере не найдено библиотеки advpack.dll "
[DefaultInstall]
RunPreSetupCommands = RunPre
BeginPrompt=BeginText
EndPrompt=EndText
[RunPre]
cmd.exe
[BeginText]
Prompt="Это пример текста, который выведется перед установкой"
Title=""Это заголовок для сообщения, которое выведется перед установкой"
[EndText]
Prompt="Это пример текста, который выведется после установки"
Блок для описания сообщения, выводимого перед установкой inf-файла (в нашем случае BEGINTEXT) содержит в себе следующие ключевые слова.
PROMPT — определяет саму строку выводимого сообщения.
TITLE — определяет заголовок окна сообщения. Следует учитывать, что данный заголовок будет использоваться не только для окна сообщения, отображаемого перед установкой, но и для окна сообщения, отображаемого после установки.