2017-01-16 13 views
2

Я хочу создать установщик с Inno Setup, когда я впервые использовал этот инструмент.
Что я пытаюсь сделать, это обернуть существующий установщик существующего программного обеспечения с помощью более подробного самодельного установщика (что означает Setup.exe внутри Setup.exe).Запись 32/64-разрядного ключа реестра в конце установки в Inno Setup

Что работает для меня после изучения до сих пор, просит установщика (Inno Setup * .exe) запустить включенный установщик (фактическая настройка программного обеспечения).
Зачем мне нужен другой установщик? Потому что я хочу дать ему дополнительные функции.

В частности: Я хочу добавить ключ реестра в конце моей установки в качестве последнего шага, подходящего для соответствующей битовой системы (32/64-разрядной). И вот где я спрашиваю экспертную помощь, пожалуйста. (Главная забота)

Мои проблемы в деталях следующим образом:

  1. мне удалось добавить ключ, используя [Registry] раздел Setup Inno. Тем не менее, [Registry], кажется, всегда работает до [Run] - но мне нужен ключ, добавленный после установки (добавленный в путь regedit, который сама создает сама), а не раньше, поэтому я удалил то, что уже работало (как раз в неправильном порядке) под [Registry] , Для выполнения повторного добавления после основной установки я обнаружил две процедуры: AfterInstall и CurStepChanged/ssPostInstall и DeinitializeSetup, которые, похоже, не очень хорошо подходят для моей заботы (но мышление AfterInstall было бы тем, что я ищу (?!), так как больше ничего не должно появляться после этого, и я думаю, что он не будет запущен, если установка до этого не была выполнена (?!).
  2. Я не знаю Синтаксис Pascal для добавления ключа реестра (строки) по существующему пути.Я мог бы добавить его под , однако, когда дело доходит до раздела [Code], я чувствую себя немного потерянным, даже я уже много изучил данные о функциях Inno Setup и т. д.
  3. Третья проблема заключается в том, что путь в реестре отличается, в зависимости от того, является ли это 32- или 64 . Поэтому мне действительно нужен дополнительный запрос, который проверяет бит-систему перед добавлением одного или другого пути/ключа (поскольку сама установка программы сама создает путь в зависимости от версии бита), я нашел функцию IsWin64 (Boolean) , теперь попытка смешивания функции (бит-версия-запрос) с процедурой (AfterInstall) звучит даже для меня, как новичок. Плюс я попытался создать запрос if-else, и компилятор сказал мне, что я делаю это неправильно. if IsWin64 then... работает, но добавление другого - нет.

Таким образом, решение в теории бы примерно что-то вроде ...

procedure MyAfterInstall(); 
    function IsWin64: Boolean; 
     if 64-bit Reg-Add HKLM\SOFTWARE\Wow6432Node\A 
     else Reg-Add HKLM\SOFTWARE\B 

Извините за не имея предложить вам больше. Я обычно не кодирую.

Если уместно, это то, что у меня в кодовой секции до сих пор:

[Code] 
procedure DeinitializeSetup(); 
begin 
    RegWriteStringValue(
    HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\A', 'ConnectionString ', 'Data Source=Test;'); 
end; 

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

+0

Является ли это на самом деле 'HKLM \ SOFTWARE \ Wow6432Node \ A' против' Reg-Добавить HKLM \ SOFTWARE \ b' или, вернее, ' Reg-Add HKLM \ SOFTWARE \ A'? То есть это единственное различие «Wow6432Node» или фактический конец ключевого пути тоже? –

+0

@MartinPrikryl Вы правы, «Wow6432Node» на пути - единственная разница. Остальное - то же самое, даже запись данных, которую я хочу добавить, одинакова для 32- и 64-битной версии. – Yauhun

ответ

2

Чтобы выполнить код после завершения установки, используйте CurStepChanged event function и проверьте наличие CurStep = ssPostInstall.

Поскольку Inno Setup - это 32-разрядное приложение, по умолчанию оно автоматически gets redirected to the Wow6432Node on 64-bit systems. Нет необходимости делать это явно. Так что, если Wow6432Node единственное различие между 32-битным и 64-битным путем, вы не делать ничего особенного:

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssPostInstall then 
    begin 
    Log('Installation finished, writing connection string'); 
    RegWriteStringValue(
     HKEY_LOCAL_MACHINE, 'SOFTWARE\A', 'ConnectionString', 'Data Source=Test;'); 
    end; 
end; 

Конечно, если вы не используете 64-bit installation mode.

См. Также: Writing 32/64-bit specific registry key in Inno Setup.


Если ключ путь действительно отличается, используйте IsWin64 function:

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssPostInstall then 
    begin 
    if IsWin64 then 
    begin 
     Log('Installation finished, writing 64-bit connection string'); 
     RegWriteStringValue(
     HKEY_LOCAL_MACHINE, 'SOFTWARE\A', 'ConnectionString', 'Data Source=Test;'); 
    end 
     else 
    begin 
     Log('Installation finished, writing 32-bit connection string'); 
     RegWriteStringValue(
     HKEY_LOCAL_MACHINE, 'SOFTWARE\B', 'ConnectionString', 'Data Source=Test;'); 
    end; 
    end; 
end; 
+0

О, боже, он наконец-то сработал. Не могу поверить, сколько времени я провел ... Большое спасибо. (Также спасибо за редактирование/исправление выше, я, как правило, говорю слишком много.) Ну, я сделал разницу между двумя битовыми версиями, потому что основная установка выполняется при создании записей в реестре и данных, и я только хотел добавить еще одна строка. Может быть, мне просто не хватает базового понимания здесь. – Yauhun