Inno Setup - узнайте, какие параметры установки были использованы для приложения - из приложения - PullRequest
3 голосов
/ 20 апреля 2011

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

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

1 Ответ

1 голос
/ 21 апреля 2011

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

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

[Registry]
Root: HKCU; SubKey: SOFTWARE\MyCompany\MyProg; 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('\SOFTWARE\MyCompany\MyProg', 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;

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

...