4

我最近开始使用 Inno Setup 来尝试创建一个简单的 .exe 安装程序来修改游戏。

我已经让安装程序在大多数情况下工作正常,但目前它有点基本。我真正希望安装程序做的是自动找到该 mod 设计的游戏的安装目录(战争黎明 - 黑暗十字军东征),因此用户无需手动浏览它。

我读过 Inno 安装程序可以根据注册表项设置 DefaultDir。然而,虽然“目标”游戏确实创建了一个包含其安装目录的注册表项,但该游戏可以通过数字方式(通过 Steam)或物理方式购买,它会根据所购买的格式创建不同的注册表项。我的 mod 与任何一种格式,但如果有多个可能的注册表项格式,我不知道如何设置 DefaultDir。

是否有某种“通配符”功能可以从其注册表项中返回游戏的安装目录,而无需输入准确的完整注册表项值(即某种注册表通配符)?或者搜索它可能具有的两个可能值,然后如果它没有找到则默认为 {src} ?

4

2 回答 2

5

除了在[Code]别处使用 as 回答之外,您还可以嵌套注册表常量:

DefaultDirName={reg:HKLM,Software\Vendor1\Application,InstallPath|{reg:HKLM,Software\Vendor2\Application,InstallPath|{pf}\DefaultInstallPath}}

这将使用 Vendor1 的路径(如果存在);如果失败,它将尝试 Vendor2 的路径,并且只有当它无法找到其中任何一个时,它才会回退到某个默认值。

于 2013-03-25T19:44:04.843 回答
4

您可以通过该部分分配DefaultDirName指令的值。[Code]例如,以下伪脚本显示了如何在注册表中查询两个字符串值并将找到的第一个返回给DefaultDirName指令。如果没有找到查询的注册表值,则返回默认常量值:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={code:GetDirName}

[Code]
function GetDirName(Value: string): string;
var          
  InstallPath: string;
begin
  // initialize default path, which will be returned when the following registry
  // key queries fail due to missing keys or for some different reason
  Result := '{pf}\Default Dir Name';
  // query the first registry value; if this succeeds, return the obtained value
  if RegQueryStringValue(HKLM, 'Software\Vendor\Application', 'First Key', InstallPath) then
    Result := InstallPath
  // otherwise the first registry key query failed, so...
  else
  // query the second registry value; if it succeeds, return the obtained value
  if RegQueryStringValue(HKLM, 'Software\Vendor\Application', 'Second Key', InstallPath) then
    Result := InstallPath;
end;
于 2013-03-25T11:03:54.417 回答