Используйте часть ключа/значения реестра в сценарии Inno Setup.

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

Это предыдущее приложение размещает службу и предоставляет только один ключ/значение реестра, в котором размещается эта информация: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\APPLICATION, в котором размещается значение ImagePath, данные которого "E:\TestingDir\Filename.exe".

Мне нужен способ извлечь только путь установки (E:\TestingDir) без файла Filename.exe.

Любое предложение? большое спасибо


person Luca    schedule 08.01.2016    source источник
comment
Вы бы использовали сценарий паскаля; RegQueryStringValue(), чтобы получить путь в строке, затем используйте ExtractFileDir(), чтобы получить часть каталога   -  person Alex K.    schedule 08.01.2016
comment
отличная идея! Будет ли переменная, определенная в разделе кода, также считываться в разделе Rn? Не совсем понятно, как связать то, что находится в разделе запуска, со всем, что есть в коде паскаля... спасибо!   -  person Luca    schedule 08.01.2016
comment
кроме того, проблема в том, что мне нужно прочитать значение реестра на целевой машине (где установлено), в то время как extractfiledir, если я правильно помню, извлечет значения на компилирующей машине (источник), не так ли? еще раз спасибо   -  person Luca    schedule 08.01.2016


Ответы (2)


Этого можно добиться с помощью константы скрипта.

Вы определяете функцию, которая выдает нужное вам значение:

[Code]

function GetServiceInstallationPath(Param: string): string;
var
  Value: string;
begin
  if RegQueryStringValue(
       HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\APPLICATION',
       'ImagePath', Value) then
  begin
    Result := ExtractFileDir(Value);
  end
    else
  begin
    Result := { Some fallback value }
  end;
end;

И затем вы ссылаетесь на него, используя {code:GetServiceInstallationPath}, где вам это нужно (например, в разделе [Run]).

Например:

[Run]
Filename: "{code:GetServiceIntallationPath}\SomeApp.exe"

На самом деле, вы, вероятно, уже хотите получить значение в InitializeSetup, и кэшировать значение глобальной переменной для использования в скриптовой константе. И прервать установку (возвратив False из InitializeSetup), если другое приложение не установлено (= раздел реестра не существует).

[Code]

var
  ServiceInstallationPath: string;

function InitializeSetup(): Boolean;
var
  Value: string;
begin
  if RegQueryStringValue(
       HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\APPLICATION',
       'ImagePath', Value) then
  begin
    ServiceInstallationPath := ExtractFileDir(Value);
    Log(Format('APPLICATION installed to %s', [ServiceInstallationPath]));
    Result := True;
  end
    else
  begin
    MsgBox('APPLICATION not installed, aborting installation', mbError, MB_OK);
    Result := False;
  end;
end;

function GetServiceInstallationPath(Param: string): string;
begin
  Result := ServiceInstallationPath;
end;

См. также аналогичный вопрос: Использование глобальной строковой переменной сценария в разделе "Выполнить" в Inno Setup.

person Martin Prikryl    schedule 08.01.2016
comment
Привет Мартин, это мне очень помогает! Более того, необходимо пропустить установку, если реестра нет: идея состоит в том, что, если реестр существует, использовать путь для помещения некоторых файлов. С другой стороны, вместо этого, если реестр не существует, выполнить набор операция (которая в конце также сгенерирует реестр). Таким образом, InitializeSetup() не помогает в случае, если реестр не существует. Есть ли какие-либо другие функции, которые вы предлагаете для этой области? С уважением, - person Luca; 11.01.2016
comment
Функция для чего? Я не знаю, какие операции вам нужно сделать. В любом случае, это другой вопрос, задайте его и объясните лучше. - person Martin Prikryl; 11.01.2016

Решается так: [код] var ServiceInstallationPath: string;

function MyProgCheck(): Boolean;
var
  Value: string;
begin
  if RegQueryStringValue(
       HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services\JLR STONE VCATS TO MES',
       'ImagePath', Value) then
  begin
    ServiceInstallationPath := ExtractFileDir(Value);   
    Result := True;
  end
  else
  begin
    Result := False;
  end;
end;

и в разделе [RUN] я поставил проверку условия TRUE или FALSE для этой функции в соответствии с потребностями ... Спасибо всем, кто ответил!

person Luca    schedule 11.01.2016