Inno Setup — Выяснение того, какие параметры установки использовались для приложения — из приложения

#windows-installer #inno-setup #ini #allusersprofile

#windows-установщик #inno-setup #ini #allusersprofile

Вопрос:

У меня есть установщик Inno Setup для приложения, который предлагает пользователю выбор между «Установить для всех пользователей» и «Установить только для меня». Если оно установлено для всех пользователей, файл INI помещается в commonappdata, а настройки являются общими (это требование заказчика). Если оно установлено для текущего пользователя, оно помещается в Local settings appdata.

После установки приложения, какой самый простой способ для приложения «узнать» во время выполнения, какой вариант установки использовался и, следовательно, откуда он должен прочитать и сохранить INI-файл? Кроме того, я хочу, чтобы папка «по умолчанию» (та, в которую пользователь помещается при первой попытке открыть файл данных) была MyDocs для установки одним пользователем и SharedDocs для установки всеми пользователями, и я предполагаю, что решение будет работать и для этого.

Ответ №1:

Пусть программа установки запишет значение реестра в HKCU, если выбрано «установить только для меня». Запросите ключ при запуске программы и соответствующим образом определите папку по умолчанию.

Если вы используете задачу, позволяющую пользователю выбирать тип установки, вы можете использовать запись реестра, подобную этой:

 [Registry]
Root: HKCU; SubKey: SOFTWAREMyCompanyMyProg; ValueType: dword; ValueName: InstallUserOnly; ValueData: 1; Tasks: install_just_for_me; Flags: UninsDeleteValue; 
  

Затем при запуске приложения вы можете сделать что-то вроде:

 function GetSpecialFolderPath(Folder: Integer; CanCreate: Boolean): string;
begin
  SetLength(Result, MAX_PATH   1);
  SHGetSpecialFolderPath(0, PChar(Result), FOLDER, CanCreate);
  Result := PChar(Result);
end;

...
var
  Reg: TRegistry;
  DefFolder: string;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('SOFTWAREMyCompanyMyProg', False) then begin
      if Reg.ValueExists('InstallUserOnly') then
        DefFolder := GetSpecialFolderPath(CSIDL_PERSONAL, True)
      else
        DefFolder := GetSpecialFolderPath(CSIDL_COMMON_DOCUMENTS, True);
    end;
  finally
    Reg.Free;
  end;
  

Вы, конечно, можете также прочитать значение реестра, если хотите.

Комментарии:

1. Обратите внимание, что если вы используете подход «задача», вы можете узнать, выбрано ли оно во время установки HKLMSoftwareMicrosoftWindowsCurrentVersionUninstall{AppID}_is1 из значения Inno Setup: Selected Tasks . Но поскольку один пользователь может устанавливать для себя, а другой — для всех пользователей, это может быть ненадежно.

2. Спасибо, @Sertac. Хороший ответ. Вы заставили меня задуматься. Приложение устанавливает INI-файл по умолчанию, если он не найден. Предположительно, я мог бы вместо этого добавить запись в INI-файл после его установки, чтобы добиться того же?

3. @rossmcm — Добро пожаловать! Я не понимаю, почему нет. Вы можете очень хорошо отслеживать установки с помощью таких файлов, как ‘[InstallType]’ ‘username=userinstall’ ‘otheruser = commoninstall’…

4. @Sertac. Еще одна вещь. Я не использую задачи, я использую параметр check: для условного выполнения инструкций Inno. Предположительно, я мог бы вместо этого закодировать: [Registry] Root: HKCU; SubKey: SOFTWAREMyCompanyMyProg; ValueType: dword; ValueName: InstallUserOnly; ValueData: 1; check: InstallForJustMe ; Flags: UninsDeleteValue; (InstallForJustMe — это логическая функция, определенная в разделе кода).

5. … Я полагаю, что я получу выбор типа установки от пользователя во время установки и запишу его в HKLM. Когда приложение запускается, я читаю HKLM и решаю, где прочитать / сохранить INI-файл, в зависимости от типа установки.