【问题标题】:Inno Setup - Finding out what install options were used for an application - from the applicationInno Setup - 从应用程序中找出应用程序使用了哪些安装选项
【发布时间】:2011-08-09 03:52:24
【问题描述】:

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

安装应用程序后,应用程序在运行时“知道”所使用的安装选项是什么以及应该从哪里读取和保存 INI 文件的最简洁方法是什么?另外,我希望“默认”文件夹(用户第一次尝试打开数据文件时放置的文件夹)是 MyDocs 用于单用户安装,而 SharedDocs 用于所有用户安装,我假设该解决方案也适用于此。

【问题讨论】:

    标签: windows-installer inno-setup ini allusersprofile


    【解决方案1】:

    如果选择“只为我安装”,让安装程序在 HKCU 下写入注册表值。程序启动时查询key,确定默认文件夹。

    如果您使用任务让用户选择安装类型,您可以使用如下注册表项:

    [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}_is1。但由于一个用户有可能为自己安装另一个为所有用户安装,这可能并不可靠。
    • 谢谢@Sertac。好答案。你让我开始思考。如果找不到,该应用程序会安装一个默认的 INI 文件。大概我可以在安装 INI 文件后添加一个条目来实现同样的效果?
    • @rossmcm - 不客气!我不明白为什么不。您可以很好地跟踪安装,例如 '[InstallType]' 'username=userinstall' 'otheruser=commoninstall'...
    • @Sertac。只是另一件事。我没有使用任务,我使用 check: 参数有条件地执行 Inno 语句。大概我可以编码:[Registry] Root: HKCU; SubKey: SOFTWARE\MyCompany\MyProg; ValueType: dword; ValueName: InstallUserOnly; ValueData: 1; check: InstallForJustMe ; Flags: UninsDeleteValue;(InstallForJustMe 是在代码部分定义的布尔函数)。
    • ... 我想我会在安装时从用户那里得到安装类型的选择,并将其写入 HKLM。当应用程序启动时,我会读取 HKLM 并根据它的安装类型决定在哪里读取/存储 INI 文件。
    猜你喜欢
    • 2011-01-29
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多