Inno Setup - 从应用程序中查找使用的安装选项

3
我有一个Inno Setup安装程序,为应用程序提供了“为所有用户安装”和“仅为我安装”的选择。如果为所有用户安装,则INI文件放置在commonappdata中,并共享设置(这是客户的要求)。如果为当前用户安装,则将其放置在本地设置appdata中。
一旦应用程序被安装,最干净的方法是让应用程序在运行时“知道”使用了哪个安装选项,从而确定应该从哪里读取和保存INI文件?此外,我希望“默认”文件夹(用户第一次尝试打开数据文件时所在的文件夹)对于单个用户安装来说是MyDocs,对于所有用户安装来说是SharedDocs,并且我假设解决方案也适用于此。
1个回答

1

如果选择“仅为我安装”,则让设置在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}_is1。但是,由于有可能一个用户为自己安装,另一个用户为所有用户安装,因此这种方法可能不太可靠。 - Sertac Akyuz
@rossmcm - 不客气!我不明白为什么不行。你可以用类似 '[InstallType]' 'username=userinstall' 'otheruser=commoninstall' 的方式很好地跟踪安装情况... - Sertac Akyuz
@Sertac。又是另外一件事。理想情况是安装程序应该将安装类型(可以是三种之一 - "只有我"、“所有人,但每个用户有单独的设置”或“所有人,所有用户共享相同的设置”)留在一个对于应用程序所有用户都可访问的位置。我能否通过 [Registry] Root: HKLM; SubKey: SOFTWARE\MyCompany\MyProg; ValueType: string; ValueName: InstallationType; ValueData: "Just me"; check: InstallForJustMe ; Flags: UninsDeleteValue; 将某些内容安装到 HKLM 中?然后无论使用哪种安装选项,所有运行此应用程序的用户都可以看到它。 - rossmcm
@Sertac - 这有点复杂(自然而然的)。关键是该应用程序在实验室环境中使用,安装在一台PC上,由许多用户使用。该PC连接了专业硬件。INI文件包含硬件设置(例如正在使用的COM端口等),客户需要能够进行一次设置,并知道所有用户都将具有相同的设置。在这种环境下,我需要“所有用户,共享设置”类型的安装。此设置选项是额外提供的,除了通常的“只有我”和“所有用户,单独设置”之外,我也提供... - rossmcm
1
我想在安装时从用户那里获取安装类型选择,并将其写入HKLM。当应用程序启动时,我会读取HKLM并根据安装类型决定在哪里读取/存储INI文件。 - rossmcm
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接