Windows installer Inno安装-了解应用程序使用了哪些安装选项-从应用程序

Windows installer Inno安装-了解应用程序使用了哪些安装选项-从应用程序,windows-installer,inno-setup,ini,allusersprofile,Windows Installer,Inno Setup,Ini,Allusersprofile,我有一个应用程序的Inno安装程序,用户可以在“为所有用户安装”和“仅为我安装”之间进行选择。如果为所有用户安装,INI文件将放置在commonappdata中,并共享设置(这是客户的要求)。如果是为当前用户安装的,则会将其放置在本地设置appdata中 一旦安装了应用程序,应用程序在运行时“知道”所使用的安装选项是什么以及从何处读取和保存INI文件的最干净方式是什么?此外,我希望“默认”文件夹(用户第一次尝试打开数据文件时放置的文件夹)对于单用户安装为MyDocs,对于所有用户安装为Share

我有一个应用程序的Inno安装程序,用户可以在“为所有用户安装”和“仅为我安装”之间进行选择。如果为所有用户安装,INI文件将放置在commonappdata中,并共享设置(这是客户的要求)。如果是为当前用户安装的,则会将其放置在本地设置appdata中


一旦安装了应用程序,应用程序在运行时“知道”所使用的安装选项是什么以及从何处读取和保存INI文件的最干净方式是什么?此外,我希望“默认”文件夹(用户第一次尝试打开数据文件时放置的文件夹)对于单用户安装为MyDocs,对于所有用户安装为SharedDocs,我假设解决方案也适用于此。如果选择了“仅为我安装”,则让安装程序在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;

当然,如果您愿意,您也可以读取注册表值。

注意,如果您使用“任务”方法,您可以从值
Inno Setup:selected Tasks
读取在安装时在
HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\{AppID}\u is1
处选择的注册表值。但由于有可能一个用户为自己安装,另一个用户为所有用户安装,这可能不可靠。谢谢,@Sertac。回答得好。你让我开始思考。如果找不到INI文件,应用程序将安装默认INI文件。大概我可以在安装INI文件后,在该文件中添加一个条目来实现相同的功能?@rossmcm-不客气!我不明白为什么不。您可以很好地跟踪像“[InstallType]”username=userinstall“”otheruser=commoninstall“…@Sertac”这样的安装。还有一件事。我没有使用tasks,而是使用check:参数有条件地执行Inno stations。大概我可以编码:
[Registry]根:HKCU;子键:SOFTWARE\MyCompany\MyProg;值类型:dword;ValueName:InstallUserOnly;价值数据:1;检查:仅为我安装;标志:未删除值相反(InstallForJustMe是在代码部分中定义的布尔函数)。。。。我想我将在安装时从用户那里获得安装类型选择,并将其写入HKLM。当应用程序启动时,我读取HKLM并根据安装类型决定在何处读取/存储INI文件。