具有依赖项的 Inno 安装程序驱动程序
Inno Setup driver with dependencies
我需要一些帮助来制作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 阶段)。
相关文章:
- 在 Ubuntu 中创建自动安装程序
- (Wix 安装程序)如何包含自定义操作依赖项
- 如何在WIX安装程序中隐藏或禁用"取消"按钮?
- 所有Visual Studio安装程序崩溃,可视化构建工具也无法正常工作
- Qt安装程序框架:检测是否安装了VC++可再发行组件
- 铬迷你安装程序大小达到1.19GB?
- 当我在 windows7 中安装程序时,我指定的字体大小不适用
- 使用Visual c ++工具与安装程序的Windows桌面
- 收到错误 87,安装程序的参数不正确DiGetDeviceInterfaceDetail
- C++ / GoogleTest - 如何在链接目录中为每个测试运行安装程序
- 使用QT安装程序框架创建.msi安装程序
- 我如何在VS 2017中的Windows安装程序安装Windows安装程序应配置What what版本
- 编译 Qt 安装程序框架静态
- QT安装程序框架:更新时奇怪的许可证错误
- QT离线安装程序和兼容的C 编译器安装
- 如何翻译使用预构建的QT安装程序框架创建的安装程序,无论OS语言如何
- Qt 安装程序框架 mac 桌面别名
- 如何生成嵌入所有文件的C++安装程序
- 串行监视器不显示安装程序或主控制器中的代码 - 波特率9600
- 使用Visual Studio 2015社区版为应用程序制作安装程序,其中集成了VC++ 2015环境