Innosetup打包脚本的整体结构一般如下所示:
;Innosetup的脚本
[Setup]
;指定安装包的各种基本属性
;版本号\应用的ID\资源目录\输出目录
;图标\压缩方式
[Languages]
;指定语言翻译对应的文件
[dirs]
;指定需要创建的目录
[Files]
;指定安装包里面需要拷贝的文件
[Registry]
;安装包需要修改的注册表
[Run]
;安装过程中需要执行的操作
[UninstallRun]
;卸载过程中需要执行的操作
[Code]
;在安装过程中需要执行的代码块
[Setup]
;指定应用的ID
AppId={{11111111-CE8D-4AC3-9C9D-2F0C038F99E9}
;指定应用的名称
AppName="TestDemo"
;指定应用锁
AppMutex=TestMutex
;指定应用的版本号
AppVersion="1.0.1"
;指定应用的发布者
AppPublisher="feifei"
;指定应用的网络地址
AppPublisherURL=""
;网络支持地址和更新地址
AppSupportURL=""
AppUpdatesURL=""
;默认安装目录
DefaultDirName="C:\\"
DirExistsWarning=no
DefaultGroupName=""
;输出安装包的名称
OutputBaseFilename="OutputPacket"
;压缩方式
Compression=lzma
SolidCompression=yes
WizardStyle=modern
;资源文件的目录
SourceDir = resource
;输出目录
OutputDir = ..\output
;是否需要管理员权限
PrivilegesRequired=admin
;图标
SetupIconFile=logo.ico
;是否允许无图标
AllowNoIcons=yes
所谓开机启动就是把应用或者脚本添加到对应的开机启动注册表中,所以我们需要通过操作注册表来实现对应的应用的开机启动。对应的操作如下所示:
[Registry]
;开启启动
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "AppAutoStart"; ValueData: "{app}\Demo.bat"
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "AppAutoStart"; ValueData: "{app}\Demo.exe"
windows下注册表分为两类,一类是win32的注册表一类是win64的注册表,通过Innosetup修改注册表的操作如下所示:
[Registry]
;创建设置win32注册表
Root: HKLM; Subkey: Software\Demo; Flags: uninsdeletekeyifempty createvalueifdoesntexist
Root: HKLM; Subkey: Software\Demo\Test; ValueName: InstallDir; ValueType: string; ValueData: {app}; Flags: uninsdeletekey createvalueifdoesntexist
;创建设置win64注册表
Root: HKLM64; Subkey: Software\Demo; Flags: uninsdeletekeyifempty createvalueifdoesntexist; Check: IsWin64
Root: HKLM64; Subkey: Software\Demo\Test; ValueName: InstallDir; ValueType: string; ValueData: {app}; Flags: uninsdeletekey createvalueifdoesntexist; Check: IsWin64
我们可以在安装包里面指定一部分代码,这部分代码会在安装包启动的时候执行,对应的设置如下所示:
[Code]
//安装程序初始化函数
function InitializeSetup(): Boolean;
var
ErrorCode: Integer;
installPath: string;
ResultCode: Integer;
version:string;
targetdir: string;
begin
// 启动安装包的时候会杀掉某个进程
ShellExec('open', ExpandConstant('{cmd}'), '/c taskkill /f /t /im Demo.exe', '', SW_HIDE, ewNoWait, ErrorCode);
//已经安装的情况下执行某个脚本
Result:= true;
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Demo\Test', 'InstallDir', installPath)then
begin
Exec (installPath + '\Test\stop.bat', '', '',SW_HIDE, ewWaitUntilTerminated, ResultCode);
if ResultCode <> 0 then
begin
Result:= true;
end
end
end;
我们可以通过安装包打包脚本指定应用安装之后的桌面快捷方式,对应的设置如下:
[Icons]
;指定应用的快捷方式
Name: "{userdesktop}\{#MyAppName}";Filename: "{app}\Test\Test.exe"; WorkingDir: "{app}\Test"
;指定脚本的快捷方式
Name: "{userdesktop}\重启应用";Filename: "{app}\Start.bat"; WorkingDir: "{app}"
Innosetup支持通过动态库扩展自己的功能。这里就介绍一下如何编写动态库,并且在Innosetup中调用。
首先编写一个动态库工程。编写动态库的时候需要注意:
1.该动态库必须以C语言的形式导出对应的接口,导出形式如下所示:
int WINAPI TestExportAPI0(char* testArgument, char* common_data) {}
int WINAPI TestExportAPI1() {}
int WINAPI TestExportAPI2() {}
int WINAPI TestExportAPI3() {}
获得了对应的动态库之后我们就可以在Innosetup脚本中调用对应的动态库函数了,调用示例如下所示:
[Code]
//引入外部函数
function TestExportAPI0(const testArgument: PAnsiChar; const commonData: PAnsiChar): Integer;
external 'TestExportAPI0@files:Demo.dll stdcall setuponly delayload loadwithalteredsearchpath';
function TestExportAPI1(): Integer;
external 'TestExportAPI1@files:Demo.dll stdcall setuponly delayload loadwithalteredsearchpath';
function TestExportAPI2(): Integer;
external 'TestExportAPI2@files:Demo.dll stdcall setuponly delayload loadwithalteredsearchpath';
function TestExportAPI3(): Integer;
external 'TestExportAPI3@files:Demo.dll stdcall setuponly delayload loadwithalteredsearchpath';
//在内部调用
function NextButtonClick(CurPageID: Integer): Boolean;
var
RetCode: Integer;
begin
Result := True;
if (CurPageID = wpReady) then
begin
IsUsing := TestExportAPI0(ExpandConstant('{app}'), ExpandConstant('{commonappdata}'));
if IsUsing = 1 then
begin
RetCode := TestExportAPI1();
end;
end;
end;