#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-файл, в зависимости от типа установки.