Другое

Как сохранить INSTALLATION_KEY в файл в Inno Setup

Узнайте, как сохранить параметр INSTALLATION_KEY в файл в Inno Setup. Решите проблему, когда установщик не создаёт файл ключа, даже при наличии кода. Гайд.

Как сохранить параметр командной строки INSTALLATION_KEY в файл в Inno Setup?

Я пытаюсь создать установщик Inno Setup, который принимает параметр INSTALLATION_KEY через командную строку и сохраняет его в C:\ProgramData\MyApp\installation_key.txt. При запуске установщика командой PowerShell:

.\myapp-setup.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /PARAM="INSTALLATION_KEY=6_LDsCTORhggFnzCjRYTt98Kqz611BLWwsevg.SUE.ionhFkDUn-pLKSaJ8OnpdxLVe0ZiXJd"

Установщик успешно создаёт каталоги C:\ProgramData\MyApp\data и C:\ProgramData\MyApp\logs, но файл installation_key.txt не создаётся. Вот мой текущий код setup.iss:

iss
[Dirs]
Name: "{commonappdata}\MyApp\data"
Name: "{commonappdata}\MyApp\logs"

[Code]
procedure SaveInstallationKey();
var
  InstallKey: string;
  KeyFile: string;
begin
  InstallKey := ExpandConstant('{param:INSTALLATION_KEY}');
  if InstallKey <> '' then
  begin
    ForceDirectories(ExpandConstant('{commonappdata}\MyApp'));
    KeyFile := ExpandConstant('{commonappdata}\MyApp\installation_key.txt');
    if not SaveStringToFile(KeyFile, InstallKey, False) then
      MsgBox('Failed to save installation key!', mbError, MB_OK);
  end;
end;

Что может мешать сохранению ключа установки в файл и как это исправить?

Проблема, с которой вы столкнулись, заключается в том, что процедура SaveInstallationKey объявлена, но никогда не вызывается в процессе установки. Inno Setup требует явного вызова процедуры в нужный момент.

Содержание

Основные проблемы в текущей конфигурации

  1. Процедура не вызывается: Вы определили процедуру SaveInstallationKey, но нигде в скрипте её не вызываете. Само определение не выполняет код.

  2. Неверный формат параметра: В команде PowerShell используется /PARAM="INSTALLATION_KEY=value", но Inno Setup ожидает /INSTALLATION_KEY=value при использовании директивы {param:INSTALLATION_KEY}.

  3. Отсутствует обработчик события: Код необходимо привязать к событию установки, например InitializeSetup или событию установки конкретного файла.

Исправленный код Setup.iss

Ниже приведён исправленный вариант вашего файла setup.iss:

iss
[Dirs]
Name: "{commonappdata}\MyApp\data"
Name: "{commonappdata}\MyApp\logs"

[Code]
procedure SaveInstallationKey();
var
  InstallKey: string;
  KeyFile: string;
begin
  InstallKey := ExpandConstant('{param:INSTALLATION_KEY}');
  if InstallKey <> '' then
  begin
    ForceDirectories(ExpandConstant('{commonappdata}\MyApp'));
    KeyFile := ExpandConstant('{commonappdata}\MyApp\installation_key.txt');
    if not SaveStringToFile(KeyFile, InstallKey, False) then
      MsgBox('Failed to save installation key to: ' + KeyFile, mbError, MB_OK);
  end;
end;

// Вызов процедуры во время инициализации установки
procedure InitializeSetup();
begin
  SaveInstallationKey();
end;

Если вы хотите сохранять ключ после установки конкретных файлов, можно использовать флаг AfterInstall:

iss
[Files]
Source: "MyApp.exe"; DestDir: "{app}"; Flags: ignoreversion
// Добавляем AfterInstall, чтобы сохранить ключ после установки MyApp.exe
Source: "MyApp.exe"; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: SaveInstallationKey;

[Code]
procedure SaveInstallationKey();
var
  InstallKey: string;
  KeyFile: string;
begin
  InstallKey := ExpandConstant('{param:INSTALLATION_KEY}');
  if InstallKey <> '' then
  begin
    ForceDirectories(ExpandConstant('{commonappdata}\MyApp'));
    KeyFile := ExpandConstant('{commonappdata}\MyApp\installation_key.txt');
    SaveStringToFile(KeyFile, InstallKey, False);
  end;
end;

Формат команды PowerShell

Нужно изменить команду PowerShell, чтобы использовать правильный формат параметра:

powershell
.\myapp-setup.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /INSTALLATION_KEY=6_LDsCTORhggFnzCjRYTt98Kqz611BLWwsevg.SUE.ionhFkDUn-pLKSaJ8OnpdxLVe0ZiXJd

Ключевое изменение – замена /PARAM="INSTALLATION_KEY=value" на /INSTALLATION_KEY=value.

Альтернативные подходы

Использование /SAVEINF для сохранения настроек

Если нужно сохранить все параметры установки (не только ключ), можно воспользоваться встроенным параметром /SAVEINF Inno Setup:

iss
[Code]
procedure InitializeSetup();
begin
  // Сохраняем настройки установки, включая ключ
  SaveStringToFile(ExpandConstant('{commonappdata}\MyApp\install_settings.inf'), 
    '[Setup]' + #13#10 + 
    'INSTALLATION_KEY=' + ExpandConstant('{param:INSTALLATION_KEY}'), 
    False);
end;

Создание специализированного обработчика ключа установки

Для более надёжной обработки ключа установки:

iss
[Code]
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  // Пропускаем страницу пароля, если ключ установлен
  if PageID = wpPassword and (ExpandConstant('{param:INSTALLATION_KEY}') <> '') then
    Result := True
  else
    Result := False;
end;

procedure SaveInstallationKey();
var
  InstallKey: string;
  KeyFile: string;
begin
  InstallKey := ExpandConstant('{param:INSTALLATION_KEY}');
  if InstallKey <> '' then
  begin
    Log('Saving installation key: ' + InstallKey);
    ForceDirectories(ExpandConstant('{commonappdata}\MyApp'));
    KeyFile := ExpandConstant('{commonappdata}\MyApp\installation_key.txt');
    if SaveStringToFile(KeyFile, InstallKey, False) then
      Log('Installation key saved successfully to: ' + KeyFile)
    else
      Log('Failed to save installation key to: ' + KeyFile);
  end;
end;

procedure InitializeSetup();
begin
  SaveInstallationKey();
end;

Тестирование и отладка

Для отладки установки добавьте логирование:

iss
[Code]
procedure SaveInstallationKey();
var
  InstallKey: string;
  KeyFile: string;
  LogFile: string;
begin
  // Создаём файл логов для отладки
  LogFile := ExpandConstant('{commonappdata}\MyApp\install_log.txt');
  
  InstallKey := ExpandConstant('{param:INSTALLATION_KEY}');
  SaveStringToFile(LogFile, 'Installation Key Parameter: ' + InstallKey, True);
  
  if InstallKey <> '' then
  begin
    SaveStringToFile(LogFile, 'Installation key is not empty', True);
    ForceDirectories(ExpandConstant('{commonappdata}\MyApp'));
    KeyFile := ExpandConstant('{commonappdata}\MyApp\installation_key.txt');
    SaveStringToFile(LogFile, 'Attempting to save to: ' + KeyFile, True);
    
    if SaveStringToFile(KeyFile, InstallKey, False) then
      SaveStringToFile(LogFile, 'Successfully saved installation key', True)
    else
      SaveStringToFile(LogFile, 'Failed to save installation key', True);
  end
  else
    SaveStringToFile(LogFile, 'Installation key parameter is empty', True);
end;

procedure InitializeSetup();
begin
  SaveInstallationKey();
end;

Запустите установщик и проверьте файл логов по пути C:\ProgramData\MyApp\install_log.txt, чтобы увидеть, что происходит.

Вопросы прав доступа к файлам

Если проблемы с созданием файла сохраняются, учтите следующее:

  1. Запуск от имени администратора: Установщик может потребовать повышенных прав для записи в C:\ProgramData\.

  2. Использование каталога пользователя: В качестве резервного варианта сохраняйте файл в локальном каталоге данных пользователя:

iss
KeyFile := ExpandConstant('{localappdata}\MyApp\installation_key.txt');
  1. Проверка создания каталога: Убедитесь, что родительский каталог существует перед попыткой записи:
iss
procedure SaveInstallationKey();
var
  InstallKey: string;
  KeyFile: string;
  DirPath: string;
begin
  InstallKey := ExpandConstant('{param:INSTALLATION_KEY}');
  if InstallKey <> '' then
  begin
    DirPath := ExpandConstant('{commonappdata}\MyApp');
    if ForceDirectories(DirPath) then
    begin
      KeyFile := DirPath + '\installation_key.txt';
      SaveStringToFile(KeyFile, InstallKey, False);
    end
    else
      MsgBox('Failed to create directory: ' + DirPath, mbError, MB_OK);
  end;
end;

Источники

  1. Inno Setup Command Line Parameters – Официальная документация по параметрам командной строки, включая {param:}
  2. SaveStringToFile Function Documentation – Официальная документация функции SaveStringToFile
  3. Saving Command-Line Parameter Value to Text File – Пример на Stack Overflow по сохранению параметров в файлы
  4. Inno Setup 6.6 Take Installation Key Parameter – Конкретный пример, похожий на ваш случай
  5. How to Use SaveStringToFile() – Руководство по правильному использованию SaveStringToFile

Вывод

Чтобы успешно сохранить параметр командной строки INSTALLATION_KEY в файл в Inno Setup:

  1. Вызовите вашу процедуру – убедитесь, что SaveInstallationKey() вызывается в событиях, таких как InitializeSetup() или AfterInstall.
  2. Используйте правильный формат параметра – замените /PARAM="INSTALLATION_KEY=value" на /INSTALLATION_KEY=value в команде PowerShell.
  3. Добавьте надёжную обработку ошибок – включите логирование или сообщения об ошибках для диагностики.
  4. Проведите тестирование с отладкой – создайте файл логов, чтобы отследить, что происходит во время установки.
  5. Учитывайте права доступа – убедитесь, что установщик имеет необходимые привилегии для записи в целевой каталог.

Наиболее вероятное решение – добавить вызов InitializeSetup() и исправить формат команды PowerShell. Если проблемы сохраняются, подход с логированием поможет точно определить, где возникает сбой.

Авторы
Проверено модерацией
Модерация