Inno Setup:如何为当前安装的DirectX版本创建'check:'函数,以及是否安装了MS VC ++ 2005

时间:2012-11-09 22:56:01

标签: inno-setup

我正在创建一个自定义安装程序,并且我在大多数情况下都按照我想要的方式设置它,除了它缺少我想要添加到安装程序的两个功能。我做了一些广泛的搜索,虽然我发现了很多类似的问题,但是我无法对这些问题做出回应并根据我的具体需求进行修改并取得任何成功。

基本上我需要做的是为'Check:'创建一个自定义函数,用于检查当前安装的DirectX版本。我知道有'RegQueryStringValue'函数,我知道密钥在注册表中的哪个位置包含版本(HKLM \ SOFTWARE \ Microsoft \ DirectX,Version)。我只是不知道如何实现代码来检查注册表中包含的版本,如果它报告的值小于4.09.00.0904,则继续我在[Files]下输入的DXSETUP。

我还想对“检查:”执行相同的例程,以便与Visual C ++ 2005(x86)一起使用。我认为这个更简单,因为它只需要检查实际的密钥是否存在(RegQueryKey?)而不是值。我相信VC ++ 2005的关键是HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 8.0

如果有人可以帮助我,我会非常感激,因为我已经搞砸了几个小时试图在没有太大成功的情况下完成一些功能。如果您需要我的任何进一步信息,我将非常乐意提供。

1 个答案:

答案 0 :(得分:3)

有一个示例用于检查Inno设置示例中包含的先决条件,以便在CodePrepareToInstall.iss中执行此类操作。 InitializeSetup显示了如何检查是否存在注册表项,您可以在DetectAndInstallPrerequisites中执行此操作。我添加了一个CheckDXVersion函数,您可以从检查4.9或更高版本(未经测试!)的DirectX注册表项中传递Version字符串。

; -- 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;