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

       

Динамические директории (AdvancedINF)


    При использовании расширенного формата INF-скриптов (AdvancedINF) Вы получаете возможность динамично указать переменные директории во время работы INF-скрипта, прочитав их из реестра. Полезно это, например, в случае выпуска патчей и заплат к собственному приложению, которое пользователь установил в любой удобный ему каталог. При этом INF-скрипт установщика главного приложения записал в реестре параметр со значением директории инсталляции. Этот параметр и является опорной точкой связи последующих обновлений с главным приложением. Пример значения в реестре:

    Теперь рассмотрим шаги, которые необходимо выполнить, чтобы получить это значение параметра реестра Path как переменную внутри INF-скрипта:

1. Необходимо добавить к текущей выполнимой секции, например, [DefaultInstalll], параметр CustomDestination

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

2. Написать дочернюю секцию, указанную в параметре CustomDestination и задать используемые номера переменных и имена дочерних секций, где определяется адрес параметра в реестре, содержащего путь. Формат обозначения указан на примере ниже. Кроме того, необходимо указать ключ, определяющий поведение интерпретатора во время установления переменной пути.

3. Написать дочернюю секцию, определяющую адрес параметра в реестре. Её тело - обычно одна строка формата строки записи в реестр, где указывается имя ключа, параметра и типового значения пути.

[DefaultInstall]

CustomDestination=dirs.CustomDest

CopyFiles=cpf.test

[dirs.CustomDest]

49000,49001,49002,49003 = RegistryDir,5

[RegistryDir]

HKLM,"Software\Company_Name\Program_Name","Path",,"Error String"

[cpf.test]filename.ext

[CustomDestination]

cpf.test = 49001



[SourceDisksFiles]

filename.ext= 1

[SourceDisksFiles]1 = "TEST","",0

    Теперь разберём пример. В секции [dirs.CustomDest] указаны четыре числа через запятую в качестве параметра.
Это имена переменных одной и той же динамической директории в разной интерпретации. Первое число (49000) содержит путь к директории "C:\Program Files\Program Name" в формате 8.3 в кодировке OEM (DOS). То есть, эта переменная содержит строку такого вида: "C:\Progra~1\Progra~1", что необходимо для поддержки 16-разрядного интерпретатора, например, setupx.dll или для других целей. Второе число (49001) содержит этот же путь к директории уже в 32-х разрядном формате путей, с поддержкой длины строки до 256 символов и в ANSI-кодировке (MS Windows). Третье число (49002) содержит строку пути в формате 8.3 в ANSI-кодировке. Нужно для формирования пути в системах с принудительно установленным форматом путей в 8.3. Четвёртое число (49003) содержит строку пути в OEM-формате (DOS), но в длинной интерпретации. Для чего это необходимо, неизвестно, вероятно, для полноты картины. При употреблении переменных можно указать любое, наиболее подходящее. Естественно, наиболее точным для MS Windows будет 49001. Несмотря на такие ухищрения, при проверке во всех четырёх переменных находится одна и та же строчка, без искажений. Быть может, это нереализованные функции перекодирования, неизвестно.

    С самым простым в этой главе мы разобрались - с, собственно, назначением директорий. Теперь приступим к более сложному, недокументированному и неоднозначному. Это - ключи, указываемые через запятую после имени дочерней секции, указывающей путь в реестре. В нашем примере - это строка 49000,49001,49002,49003 = RegistryDir,5. В этом случае ключ равен 5. Номер ключа в корне изменяет поведение интерпретатора:

1, 9 - Выводится диалоговое окно для указания директории назначения пользователем:



    При этом, для того, чтобы добиться подобных значений на площади окна, нужно совершенно изменить формат записи строки в секции [RegistryDir]:

[RegistryDir]

,,,"Укажите директорию для распаковки","C:\Test"

    После указания каталога все файлы в секции [cpf.test], а у нас это filename.ext - копируются в указанный пользователем каталог, а также все остальные файлы в секциях, в назначении которых указана эта переменная.



2, 3, 6, 10, 11 - Насколько я понимаю - эти ключи зарезервированы исключительно для вывода диалогов ошибок с произвольным текстом. Если использовать строку от примера, когда ключ равен 1, указанного выше, то появится следующее окно:



    При указании нормальной строки ничего не происходит. Странное поведение интерпретатора.

4, 5, 8, 12, 13 - Обычное копирование файлов в указанную директорию. При этом наличие ключа в реестре и его значение не играют никакой роли.

16, 18, 20, 22, 24, 26, 28, 30 Копируют файлы в поддиректорию текущей директории, с путём, равным пути в реестре. То есть, если путь к INF-скрипту таков: C:\Temp, то файлы будут скопированы в C:\Temp\Software\Company_Name\Program_Name, с автоматическим созданием всех директорий.

17, 19, 21, 23, 25, 27, 29, 31 Пытаются скопировать файлы в директорию, составную из пути, указанного в реестре и текущего пути. И, в итоге, терпят ошибку - ведь директории C:\Temp\"C:\Program Files\Program Name" не существует!

Вывод - тема пока не доделана, максимум можно выжать лишь собственноручное указание пользователем директории и присвоению его выбору переменной пути, а также проверку на наличие каких-либо параметров в реестре и при их отсутствии выводить ошибку и прекращать обработку скрипта. Эдакий однобокий if...then.


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