Inno Setup - узнать, какие параметры установки были использованы для приложения - из приложения
У меня есть установщик Inno Setup для приложения, которое предлагает пользователю выбор между "Установить для всех пользователей" и "Установить только для меня". Если он установлен для всех пользователей, файл INI помещается в commonappdata, и настройки становятся общими (это требование заказчика). Если он установлен для текущего пользователя, он помещается в локальные настройки приложения.
После того, как приложение установлено, каков самый чистый способ для приложения "знать" во время выполнения, какой была опция установки и, следовательно, откуда оно должно считывать и сохранять INI-файл? Кроме того, я хочу, чтобы папка "по умолчанию" (та, которую пользователь помещает в первый раз, когда они пытаются открыть файл данных) должна быть MyDocs для однопользовательской установки, а SharedDocs - для всех пользователей, и я предполагаю, решение будет работать для этого тоже.
1 ответ
Пусть setup запишет значение реестра в 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;
Вы можете, конечно, также прочитать значение реестра, если хотите.