具有依赖项的 Inno 安装程序驱动程序

Inno Setup driver with dependencies

本文关键字:安装 程序 驱动程序 Inno 依赖      更新时间:2023-10-16

我需要一些帮助来制作Inno安装程序,我想在我自己的项目同时安装驱动程序。当驱动程序只是一个"exe"文件时,它工作正常:

[Files]
Source: ".ComponentDriversDriver1driver1.exe"; DestDir: "{tmp}"; Check: Is64BitInstallMode;
[Codes]
ExtractTemporaryFile('driver1.exe');
Exec(ExpandConstant('{tmp}driver1.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);

但是,当驱动程序的依赖项更复杂时,就不一样了。我试图将所有文件放在临时目录中(是的,这很丑陋=))并执行驱动程序,但此解决方案不起作用。

[Files]
Source: ".ComponentDriversKeithley Driver*"; DestDir: "{tmp}"; Check: Is64BitInstallMode;
[Code]
ExtractTemporaryFile('setup.exe');
Exec(ExpandConstant('{tmp}setup.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);

你对我有好的建议吗?我可以将驱动程序及其所有依赖项压缩到一个"exe"文件中吗?感谢您的帮助,最好的问候,克莱门特。

更新 2 :这是我的完整代码:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "App"
#define MyAppVersion "1.0"
#define MyAppPublisher "Other"
#define MyAppURL "http://www.other.fr"
#define MyAppExeName "App.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}{#MyAppName}
DefaultGroupName={#MyAppName}
VersionInfoVersion={#MyAppVersion} 
AllowNoIcons=yes
OutputDir=.Deployment
OutputBaseFilename=App-Setup
SetupIconFile=.ComponentApp.ico
Compression=lzma
SolidCompression=yes
WizardImageFile=.ComponentApp.bmp
WizardSmallImageFile=.ComponentApp.bmp
[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl";
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]                             
Source: ".ComponentCal*"; DestDir: "{app}Cal"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: ".ComponentDocumentation*"; DestDir: "{app}Documentation"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: ".ComponentSoftwaresUtility*"; DestDir: "{app}Utility"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: ".ComponentSoftwaresSystem32*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: ".ComponentSoftwaresApp*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: ".ComponentDriversKeithley Driver*"; Flags: deleteafterinstall createallsubdirs recursesubdirs; DestDir: "{tmp}";
Source: ".ComponentDriversSpec Driverdriver.exe"; DestDir: "{tmp}"; Check: Is64BitInstallMode;
Source: ".ComponentDriversAdaptateradaptater.exe"; DestDir: "{tmp}"; Check: Is64BitInstallMode;
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode: Integer;
I: Integer;
begin
  // CurStep values
  // ssInstall, ssPostInstall, ssDone
  MsgBox('Hello.', mbInformation, MB_OK);
  if CurStep = ssPostInstall then begin
    Exec(ExpandConstant('{tmp}Keithley Driversetup.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
    Exec(ExpandConstant('{tmp}driver.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
    // Ask the user a Yes/No question
    if MsgBox('Do you need to use the Adaptater?', mbConfirmation, MB_YESNO) = IDYES then
    begin
      Exec(ExpandConstant('{tmp}adaptater.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
      MsgBox('Please, plug it now!', mbInformation, MB_OK);
      for I := 0 to 10 do
      begin
        Sleep(400);
      end;
    end;
  end;
end;
[Icons]
Name: "{group}{#MyAppName}"; Filename: "{app}{#MyAppExeName}"
Name: "{group}{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}{#MyAppName}"; Filename: "{app}{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}MicrosoftInternet ExplorerQuick Launch{#MyAppName}"; Filename: "{app}{#MyAppExeName}"; Tasks: quicklaunchicon

更新 3 :这是我安装带有依赖项的驱动程序的最后一个 [代码] 部分:

[Files]
Source: ".ComponentDrivers*"; Flags: deleteafterinstall createallsubdirs recursesubdirs; DestDir: "{tmp}";
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode: Integer;
I: Integer;
begin
  // CurStep values
  // ssInstall, ssPostInstall, ssDone
  if CurStep = ssPostInstall then begin
    Exec(ExpandConstant('{tmp}Keithley Driversetup.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
    Exec(ExpandConstant('{tmp}Driverdriver.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
    // Ask the user a Yes/No question
    if MsgBox('Do you need to use the Adaptater?', mbConfirmation, MB_YESNO) = IDYES then
    begin
      Exec(ExpandConstant('{tmp}Adaptateradaptater.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
      MsgBox('Please, plug it now!', mbInformation, MB_OK);
      for I := 0 to 10 do
      begin
        Sleep(400);
      end;
    end;
  end;
end;

非常感谢里克!

我不知道

如果它的目的地已经是{tmp},你为什么要打电话给ExtractTemporaryFile('setup.exe');

我认为这就足够了(请注意源代码和deleteafterinstall中的通配符):

[Files]
Source: ".ComponentDriversKeithley Driver*"; Flags: deleteafterinstall createallsubdirs recursesubdirs; DestDir: {tmp}
[Code]
Exec(ExpandConstant('{tmp}setup.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);

我以为只有在源代码行中有 dontcopy 标志时,您才会使用 ExtractTemporaryFile()。然后不会提取该文件,您可以在代码中手动提取。没有dontcopy标志,你就不需要它。

此外,您的[code]段不完整。

下面是一个工作 .iss 的小示例:

[Setup]
AppName=test
AppVerName=test
DefaultDirName=C:TEMP
OutputBaseFilename=test
OutputDir=C:TEMP
Uninstallable=no
;PrivilegesRequired=none
PrivilegesRequired=admin
Compression=lzma/ultra
SolidCompression=yes
[Files]
Source: ".ComponentDriversKeithley Driver*"; Flags: deleteafterinstall createallsubdirs recursesubdirs; DestDir: {tmp}
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  // CurStep values
  // ssInstall, ssPostInstall, ssDone
  if CurStep = ssPostInstall then begin
    MsgBox('Hello.', mbInformation, MB_OK);
    Exec(ExpandConstant('{tmp}setup.exe'), '-install "' + ExpandConstant('{tmp}') + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
  end;
end;

您的文件将只在 ssPostInstall 阶段的 {tmp} 目录中(而不是在 ssInstall 阶段)。