4

最近、Inno Setupを使用して、ゲームを変更するための簡単な.exeインストーラーを作成し始めました。

インストーラーはほとんど正常に動作していますが、現時点では少し基本的です。インストーラーに本当にしてもらいたいのは、modが設計されているゲームのインストールディレクトリ(Dawn of War-Dark Crusade)を自動的に見つけて、ユーザーが手動で参照する必要がないようにすることです。

Innoインストーラーがレジストリエントリに従ってDefaultDirを設定できることを読みました。ただし、「ターゲット」ゲームはインストールディレクトリを含むレジストリエントリを作成しますが、ゲームはデジタル(Steam経由)または物理的に購入でき、購入した形式に応じて異なるレジストリエントリを作成します。私のmodはで動作しますどちらの形式でも、可能なレジストリキーの形式が複数ある場合にDefaultDirを設定する方法がわかりません。

正確な完全なレジストリキー値(つまり、ある種のレジストリワイルドカード)を入力しなくても、ゲームのインストールディレクトリをレジストリエントリから返す、ある種の「ウィルカード」関数はありますか?または、2つの可能な値を検索し、どちらも見つからない場合はデフォルトで{src}に設定しますか?

4

2 に答える 2

5

他の場所で回答されているように使用することに加えて[Code]、レジストリ定数をネストすることもできます。

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]。たとえば、次の疑似スクリプトは、レジストリ内の2つの文字列値をクエリし、最初に見つかったものを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 に答える