inno setup学习入门

Inno Setup是什么?

Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年。话不多说,开整

组件相关

文本框/编辑框

编辑框也叫文本框,是典型的窗口可视化组件,既可以用来输入文本,
也可以用来显示文本,是程序设计中最常用的组件之一,可以获取用户输入的许多信息。
Pascal中的编辑框由类Tedit实现,该类的定义如下:

[code]
var  //类型定义
  mypage:TwizardPage;
  lb1,lb2,lb3:TLabel;
  ed1,ed2,ed3:TEdit;
  ClientUrl,WampPort,ClientPort:String;
procedure InitializeWizard ();
begin
  mypage:=CreateCustomPage(wpWelcome,'数据统计','配置默认的网址');
   //文本框标题
  lb1 := TLabel.Create(mypage);
  lb1.Parent:=mypage.Surface;
  lb1.Caption := '服务器地址:';
  lb1.Top := lb1.Top+50;
  lb1.Autosize := true;
  //文本框内容
  ed1:=TEdit.Create(mypage);
  ed1.Parent:=mypage.Surface;
  ed1.Width:=200;
  ed1.Left := 80;
  ed1.Top := lb1.Top;
  ed1.Text:='127.0.0.1';
  //ip
  lb2 := TLabel.Create(mypage);
  lb2.Parent:=mypage.Surface;
  lb2.Caption := '服务器端口:';
  Lb2.Top:=lb1.Top+50;
  lb2.Autosize := true;

  ed2:=TEdit.Create(mypage);
  ed2.Parent:=mypage.Surface;
  ed2.Width:=200;
  ed2.Left := 80;
  ed2.Top := ed1.Top+50;
  ed2.Text:='8083'; 
end; 
 //读取文本框内容并修改配置文件ini中内容  
function NextButtonClick ( CurPageID : Integer): Boolean;
begin
    ClientUrl:= ed1.Text;
    WampPort:= ed2.Text;
    Result := true;
end;

function MyConst(Param: String): String;
begin
  Result := ClientUrl;
end;
function MyConst2(Param: String): String;
begin
  Result := WampPort;
end;
function MyConst3(Param: String): String;
begin
  Result := ClientPort;
end;

列表框/复选框

列表框 (ListBox)是Windows应用程序中重要的输入手段,
其中包括多个选项用户可以从其中选择一个或者多个,程序根据用户的选择做出相应的处理,
列表框在外观上和存储框类似,但是行为却有很大的不同,列表框中项一般是预先给定的,
而存储框则可以让用户进行输入,并且列表框中的项被选择之后也会触发事件。
Pascal脚本中列表框的类由TlistBox实现,其定义如下:

TListBox = class(TCustomListBox)

property BorderStyle: TBorderStyle; read write;

property Color: TColor; read write;

property Font: TFont; read write;

property MultiSelect: Boolean; read write;

property Sorted: Boolean; read write;

property Style: TListBoxStyle; read write;

property OnClick: TNotifyEvent; read write;

property OnDblClick: TNotifyEvent; read write;

property OnKeyDown: TKeyEvent; read write;

property OnKeyPress: TKeyPressEvent; read write;

property OnKeyUp: TKeyEvent; read write;

end;

安装语言选项

nno Setup安装目录下有一个Languages的文件夹,该文件夹提供了可供使用的语言,
通过在脚本中加入[languages]段,可以实现该项功能,实现代码如下:

[languages]

Name: "en"; MessagesFile: "compiler:Default.isl"

Name: "cs"; MessagesFile: "compiler:Languages\ChineseSimp.isl"

安装过程中会根据用户的选择采用不同的语言界面:

安装添加图片

图片必须放在脚本文件相同的目录下,如果不是,需要提供完整的路径,并且必须是BMP的位图,手册上规定图片的最大尺寸是164x314 pixels,但是稍微超出似乎也没有什么问题

[setup]
AppName=Test
AppVerName=TEST
DefaultDirName="E:\TEST"
AppVersion=1.0
WizardImageFile=dh.bmp

[files]
Source: "F:\desktop\ipmsg.exe"; DestDir: "{app}"

桌面快捷方式

[icons]
Name:: "{userdesktop}\飞鸽传书";Filename: "{app}\ipmsg.EXE"; WorkingDir: "{app}"

注意Icons段中的一些选项:

  • Name :要创建的快捷方式的名字和位置,上例中将会在当前用户的桌面创建一个名为“飞鸽传书”快捷图标,该选项是是必须的。

  • FileName** :快捷方式的命令行文件名,即快捷方式指向的实际可执行文件,这里是ipmsg.exe文件,该项为必须的。

  • Parameters :Parameters:快捷方式的可选命令行参数,如果编写的是一个命令行方式的可执行文件,额可以通过该选项传递参数,一般的可执行文件都不需要该选项。

  • WorkingDir :快捷方式的工作 (或启动) 目录,就是指示程序在哪个目录开始运行。

  • HotKey** :快捷方式的热键 (或快捷键) 设置,就是可以用于启动程序的组合键

  • Comment** :指定快捷方式的注释 (或描述) 对象,当鼠标移动到该快捷方式上的时候会有一个黄色的小窗口给出提示,一般是该程序的描述。

  • IconFileName :要显示的自定义图标文件名。这可以是一个包含图标文件的可执行映像即.exe或者.dll)也可以是一个.ico 文件,默认会采用原可执行文件的图标。

  • IconIndex :指定的文件中使用的以零为基点的图标索引,这是因为有些Icon可以存放在.dll文件中,例如操作系统中的shell32.dll文件,保存有100多个图标,如果- IconFileName :指定的是该文件(一般位于C:\WINDOWS\system32目录下),那么IconIndex 就指定了使用哪个图标。

Pascal脚本概述

[Files] 段

[Files]段通常用来将文件打包到安装包中,如果是需要安装过后读取本地文件,则需要将文件释放

[Files]
//需要打包文件 Source表示本地文件, DestDir表示安装包资源文件目录
//前者的 {tmp}表示本地的 脚本根目录下的 {tmp} 目录,后者表示 exe运行后的临时目录
//  * 表示任何文件
Source: "F:\Users\Admin\Desktop\第一次测试\安装目录\TimePRO.exe"; DestDir: "{app}"; Flags: ignoreversion

Source: "F:\Users\Admin\Desktop\第一次测试\安装目录\Client.ini"; DestDir: "{app}"; Flags: ignoreversion

[Code] 段

文件释放

文件释放的意思就是将已经打包到exe安装包中文件,在安装后解压到你指定的位置.

   //告诉安装包你ini怎么用
function ImgLoad5(Wnd :HWND; FileName :PAnsiChar; Left, Top, Width, Height :integer; Stretch, IsBkg :boolean) :Longint; external 'ImgLoad@{tmp}\Client.ini stdcall delayload';
procedure ImgSetVisibility5(img :Longint; Visible :boolean); external 'ImgSetVisibility@{tmp}\Client.ini stdcall delayload';
//初始化开始界面
procedure InitializeWizard();
begin
SelectPortPage; //这是配置文件页面

//ini安装包释放  {tmp}表示本地的
ExpandConstant('{tmp}\Client.ini') 

end;

JDK运行环境

本段介绍的是如何保证exe文件在没有jdk环境下运行,实现安装jdk并自动配置java环境变量

1.[File]段将jdk加载到exe中

Source: "F:\Users\Admin\Desktop\第一次测试\安装目录\jdk-8u201-windows-x64.exe"; DestDir: "{app}"; Flags: ignoreversion              //ignoreversion 表示卸载删除

2.设置环境变量加到注册表(Const不能运行请更改 inno setup版本到5.5.1)

Const
  WM_SETTINGCHANGE = $1A;
  SMTO_ABORTIFHUNG = $2;
Function SendMessageTimeout(hwnd, msg, wParam: LongInt; lParam: String; fuFlags, uTimeout: LongInt; var lpdwResult: LongInt): LongInt;external 'SendMessageTimeoutA@user32.dll stdcall';
var
  iRes: LongInt;

procedure SetEnv(aEnvName, aEnvValue: string); //设置环境变量
begin
  RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', aEnvName, aEnvValue)
  //刷新环境变量 不需要重启生效
  SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000, iRes);

end;

var
JavaDirStr:string;

function CheckJre8:boolean ;
var
ResultStr:string;
HKLMS:Integer;
begin
  HKLMS:=HKLM
  IF IsWin64=TRUE THEN
  BEGIN
  HKLMS:=HKLM64
  END
     //添加到注册表
  result:= RegQueryStringValue(HKLMS,'SOFTWARE\JavaSoft\Java Development Kit\1.8','JavaHome',JavaDirStr)
end;

3.指定jdk到安装目录

procedure CurStepChanged(CurStep: TSetupStep);
var
rcode:integer;
begin
  if CurStep=ssPostInstall then
  begin
    if CheckJre8=false then
    begin
      if IsWin64=true then
      begin
        ExecAndWait(ExpandConstant('{tmp}\jdk-8u201-windows-x64.exe'), '', '', SW_SHOW, True);
      end else
      begin
        ExecAndWait(ExpandConstant('{tmp}\jdk-8u201-windows-x64.exe'), '', '', SW_SHOW, True);
      end
    end
  end

  if (CurStep=ssDone) and (CheckJre8=true) then
  begin   //JavaHome为环境变量 path
    SetEnv('JavaHome',JavaDirStr); //安装环境变量
  end
  if CurStep=ssDone then
  begin
      PosStr
  end
end;

读取ini并更改其内容

比如在config.ini中有如下配置

[config]

WampPort=8103

ClientPort=9090

ClientUrl=192.168.1.119

_ 由于项目需要,需要删除[config] 但是inno setup又必须要这个段才能写文本,一下提出解决方案

//去掉ini文本 段
function LoadStringsFromFile(const str: String; var S: TArrayOfString): Boolean;
var
  File, PosString: string;
  FileLines: string;
  i: Integer;
  Isok:boolean;
begin
  File:= ExpandConstant('{src}\database.ini');
  PosString:=str
  LoadStringFromFile(File, FileLines);
  Isok:=false;
  if (Pos(PosString, FileLines) > 0) then
  begin
    Isok:=true;
  end

  if Isok=true then
  begin
    MsgBox('查找成功',mbInformation,MB_OK )
  end else
  begin
    MsgBox('查找失败',mbError,MB_OK )
  end

end;


  转载请注明: java_百科网 inno setup学习入门