Innosetup打包脚本常用设置大全


Innosetup是一款常用的打包软件,可以用来制作windows平台下的安装包。这里介绍一下通过Innosetup制作安装包的时候,那些常用设置。

Innosetup脚本框架

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;

猜你喜欢

转载自blog.csdn.net/yang1fei2/article/details/129939211
今日推荐