2013-03-25 2 views
4

Я недавно начал использовать Inno Setup, чтобы попытаться создать простой установщик .exe для модификации игры.Inno Setup - настройка DefaultDir с использованием подстановочного реестра?

У меня есть программа установки, работающая отлично по большей части, но она немного базовая на данный момент. То, что мне действительно хотелось бы сделать установщику, - это автоматически найти каталог установки для игры, разработанный мод (Dawn of War - Dark Crusade), поэтому пользователю не нужно просматривать его вручную.

Я читал, что установщик Inno может установить DefaultDir в соответствии с записью реестра. Однако, в то время как игра «цель» создает запись в реестре, содержащую его каталог установки, игру можно приобрести либо в цифровой форме (через Steam), либо физически, и она создает разные записи в реестре в зависимости от формата, в котором он купил. Мой мод работает с либо формат, но я не знаю, как установить DefaultDir, если существует более одного возможного формата ключа реестра.

Есть ли какая-то функция «wilcard», которая вернет каталог установки игры из своей записи в реестре без моего ввода точного полного значения ключа реестра (т. Е. Какого-либо вида реестра)? Или поиск двух возможных значений, которые он мог бы иметь, а затем по умолчанию - {src}, если он не найден?

ответ

4

Вы можете присвоить значение директивы DefaultDirName через раздел [Code]. Например, следующий псевдо-скрипт показывает, как запросить два строковых значения в реестре и вернуть первое найденное в директиву DefaultDirName. Если ни один из запрошенных значений реестра не найдено, постоянное значение по умолчанию возвращается:

[Setup] 
AppName=My Program 
AppVersion=1.5 
DefaultDirName={code:GetDirName} 

[Code] 
function GetDirName(Value: string): string; 
var   
    InstallPath: string; 
begin 
    // initialize default path, which will be returned when the following registry 
    // key queries fail due to missing keys or for some different reason 
    Result := '{pf}\Default Dir Name'; 
    // query the first registry value; if this succeeds, return the obtained value 
    if RegQueryStringValue(HKLM, 'Software\Vendor\Application', 'First Key', InstallPath) then 
    Result := InstallPath 
    // otherwise the first registry key query failed, so... 
    else 
    // query the second registry value; if it succeeds, return the obtained value 
    if RegQueryStringValue(HKLM, 'Software\Vendor\Application', 'Second Key', InstallPath) then 
    Result := InstallPath; 
end; 
+3

Возможно, вы захотите «ExpandConstant» по умолчанию. – Miral

4

В дополнение к использованию [Code], как ответил в другом месте, вы можете также постоянные гнезда реестра:

DefaultDirName={reg:HKLM,Software\Vendor1\Application,InstallPath|{reg:HKLM,Software\Vendor2\Application,InstallPath|{pf}\DefaultInstallPath}} 

Это будет использовать Путь поставщика, если он существует; в противном случае он попробует путь Vendor2, и только если он не сможет найти ни один из них, он вернется к некоторому значению по умолчанию.

+0

Мне нравится этот путь. [+1] – TLama