0

カスタム インストーラーを作成中ですが、セットアップに追加したい 2 つの機能が欠けていることを除いて、ほとんどの場合、希望どおりにセットアップされています。広範な検索を行ったところ、同様の質問がたくさん見つかりましたが、それらに対する回答を取得して、特定のニーズに合わせて変更することはできませんでした.

基本的に、現在インストールされている DirectX のバージョンをチェックする「Check:」のカスタム関数を作成する必要があります。「RegQueryStringValue」関数があることは知っており、バージョン (HKLM\SOFTWARE\Microsoft\DirectX, Version) を含むレジストリ内のキーの場所も知っています。レジストリに含まれているバージョンをチェックするコードを実装する方法がわかりません。4.09.00.0904 未満の値が返された場合は、[ファイル] の下に入力した DXSETUP を続行します。

また、Visual C++ 2005 (x86) で使用する「チェック:」に対しても同じルーチンを実行したいと考えています。これは、値ではなく実際のキー (RegQueryKey?) が存在するかどうかを確認するだけでよいため、より単純になると思います。VC++ 2005 のキーは HKLM\SOFTWARE\Microsoft\VisualStudio\8.0 だと思います

誰かが私を助けてくれるなら、私はそれを大いに感謝します. さらに詳しい情報が必要な場合は、喜んで提供させていただきます。

4

1 に答える 1

3

でこの種のことを行う Inno Setup Examples に含まれている前提条件を確認するための例がありますCodePrepareToInstall.issInitializeSetupに、レジストリ エントリの存在を確認する方法を示します。これは で実行できますDetectAndInstallPrerequisitesCheckDXVersionDirectX レジストリ エントリから文字列を渡すことができる関数を追加しました。この関数Versionは、4.9 以降 (テストされていません!) も使用できます。

; -- CodePrepareToInstall.iss --
;
; This script shows how the PrepareToInstall event function can be used to
; install prerequisites and handle any reboots in between, while remembering
; user selections across reboots.

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output

[Files]
Source: "MyProg.exe"; DestDir: "{app}";
Source: "MyProg.chm"; DestDir: "{app}";
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme;

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

[Code]
const
  (*** Customize the following to your own name. ***)
  RunOnceName = 'My Program Setup restart';

  QuitMessageReboot = 'The installation of a prerequisite program was not completed. You will need to restart your computer to complete that installation.'#13#13'After restarting your computer, Setup will continue next time an administrator logs in.';
  QuitMessageError = 'Error. Cannot continue.';

var
  Restarted: Boolean;

function InitializeSetup(): Boolean;
begin
  Restarted := ExpandConstant('{param:restart|0}') = '1';

  if not Restarted then begin
    Result := not RegValueExists(HKLM, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName);
    if not Result then
      MsgBox(QuitMessageReboot, mbError, mb_Ok);
  end else
    Result := True;
end;

function CheckDXVersion(const VerString: String): Boolean;
var
  MajorVer, MinorVer: Integer;
  StartPos: Integer;
  TempStr: string;
begin
  (* Extract major version *)
  StartPos := Pos('.', VerString);
  MajorVer := StrToInt(Copy(VerString, 1, StartPos - 1);
  (* Remove major version and decimal point that follows *)
  TempStr := Copy(VerString, StartPos + 1, MaxInt);
  (* Find next decimal point *)
  StartPos := Pos('.', TempStr); 
  (* Extract minor version *)
  MinorVer := Copy(TempStr, 1, StartPos - 1);
  Result := (MajorVer > 4) or ((MajorVer = 4) and MinorVer >= 9));
end;

function DetectAndInstallPrerequisites: Boolean;
begin
  (*** Place your prerequisite detection and installation code below. ***)
  (*** Return False if missing prerequisites were detected but their installation failed, else return True. ***)

  //<your code here>

  Result := True;

  (*** Remove the following block! Used by this demo to simulate a prerequisite install requiring a reboot. ***)
  if not Restarted then
    RestartReplace(ParamStr(0), '');
end;

function Quote(const S: String): String;
begin
  Result := '"' + S + '"';
end;

function AddParam(const S, P, V: String): String;
begin
  if V <> '""' then
    Result := S + ' /' + P + '=' + V;
end;

function AddSimpleParam(const S, P: String): String;
begin
 Result := S + ' /' + P;
end;

procedure CreateRunOnceEntry;
var
  RunOnceData: String;
begin
  RunOnceData := Quote(ExpandConstant('{srcexe}')) + ' /restart=1';
  RunOnceData := AddParam(RunOnceData, 'LANG', ExpandConstant('{language}'));
  RunOnceData := AddParam(RunOnceData, 'DIR', Quote(WizardDirValue));
  RunOnceData := AddParam(RunOnceData, 'GROUP', Quote(WizardGroupValue));
  if WizardNoIcons then
    RunOnceData := AddSimpleParam(RunOnceData, 'NOICONS');
  RunOnceData := AddParam(RunOnceData, 'TYPE', Quote(WizardSetupType(False)));
  RunOnceData := AddParam(RunOnceData, 'COMPONENTS', Quote(WizardSelectedComponents(False)));
  RunOnceData := AddParam(RunOnceData, 'TASKS', Quote(WizardSelectedTasks(False)));

  (*** Place any custom user selection you want to remember below. ***)

  //<your code here>

  RegWriteStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName, RunOnceData);
end;

function PrepareToInstall(var NeedsRestart: Boolean): String;
var
  ChecksumBefore, ChecksumAfter: String;
begin
  ChecksumBefore := MakePendingFileRenameOperationsChecksum;
  if DetectAndInstallPrerequisites then begin
    ChecksumAfter := MakePendingFileRenameOperationsChecksum;
    if ChecksumBefore <> ChecksumAfter then begin
      CreateRunOnceEntry;
      NeedsRestart := True;
      Result := QuitMessageReboot;
    end;
  end else
    Result := QuitMessageError;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := Restarted;
end;
于 2012-11-09T23:08:01.280 に答える