При использовании расширенного формата 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 - Выводится диалоговое окно для указания директории назначения пользователем: