1. 程式人生 > >Inno Setup使用進階(一)

Inno Setup使用進階(一)

   說明:本文用的Inno Setup的版本是5.1.8。示例程式位於Inno Setup V5.18安裝目錄"Examples目錄下。本文對筆者轉載的一篇文章《Inno Setup使用教程》根據筆者實際工作中用到的東西進行縮減和修改而成。

一.介紹

Inno Setup是一個開源免費的安裝程式製作工作。安裝程式是以指令碼的方式建立的,其副檔名為.issInno Setup Script)。

二.常量

       Inno Setup有一些自帶的常量,它們被一對大括號({})括起來,當安裝程式被啟動的時候,這些常量將被轉換成其真實的值,這依賴於使用者的選擇和系統配置,例如,{win} 這個常量在絕大多數的系統當中將被轉換成

“C:"WINDOWS” 

1.目錄常量

1{app}

       應用程式目錄,這是使用者在安裝嚮導的選擇安裝目錄頁裡面所選擇的。這是Inno Setup中最常用的一個變數。

2{win}

       系統的Windows目錄,一般為“C:"WINDOWS”。例如:如果你使用了 {win}"MYPROG.INI ,而你的 Windows 目錄是“C:"WINDOWS”,那麼安裝程式就會將它轉換成“C:"WINDOWS"MYPROG.INI” 

3{sys}

       系統的 Windows 系統(System)目錄(在 Windows NT/2000 下是 System32)。

 例如:如果你使用了 {sys}"CTL3D32.DLL,並且系統的 Windows 系統目錄是“C:"WINDOWS"SYSTEM”,那麼安裝程式就會將它轉換成“C:"WINDOWS"SYSTEM"CTL3D32.DLL” 

4{src}

       指向安裝程式所在的位置。

5{sd}

       系統驅動器,它是指 Windows 被安裝到的那個驅動器,典型的是“C:”,對於 Windows NT/2000,這個常量同系統的環境變數“SystemDrive”是等效的。 

6{pf}

       也是Inno Setup中比較常用的一個常量,這個路徑是系統的Program Files目錄,典型的是“

C:"Program Files”。

7{cf}

       公共資料夾(Common Files),這個路徑是系統的 Common Files 資料夾,典型的是“C:"Program Files"Common Files” 

8{tmp}

       臨時目錄,這個目錄並不是使用者的 TEMP 環境變數指向的目錄,而是安裝程式在啟動時在使用者的臨時目錄下建立的一個子目錄(它有一個類似於“ C:"WINDOWS"TEMP"IS-xxxxx.tmp”這樣的名字),在安裝程式退出時所有的檔案和子目錄將會被刪除。對於在 [Run] 段裡面要被執行且在安裝以後又不需要的程式檔案來說這個功能是非常有用的。

9{fonts}

字型目錄。

10{dao}

DAO 目錄,當安裝程式執行在 Windows 95/NT 4+ 上時,它被等效為 {cf}"Microsoft Shared"DAO,當運行於 Windows NT 3.51 時,它被等效為 { win}"MSAPPS"DAO

2.Shell資料夾常量

筆者尚未用到,在此不作講述。

3.其它的常量

1{"}

       一個反斜槓字元,請參見本頁前面提到的關於常量 {"} 和單字元 " 在使用上有何不同的說明。

2{%NAME}

       內嵌一個環境變數,這個 NAME 是要使用的環境變數的名字。如果在使用者的系統當中指定的環境變數不存在,這個常量就會被一個空的字串所替代。 

3{computername}

       安裝程式正在執行的計算機的名稱(就是“GetComputerName”函式的返回值)。 

4{groupame}

       使用者在安裝程式嚮導的選擇程式組頁選擇的程式組的名稱,這個是不同於 {group} 的,它不包括路徑。

5{hwnd}

       (專門用途)傳送安裝程式背景視窗的視窗控制代碼。

6{reg:HKxx"SubkeyName,ValueName|DefaultValue}  

HKxx 指定根鍵(root key),參見 [Registry]  文件所列出的根鍵。 

SubkeyName 指定要讀取的子鍵的名稱。 

ValueName 指定要讀取的值的名稱,要讀取一個鍵的預設值就讓 ValueName 為空。 

DefaultValue 如果指定的登錄檔值不存在或者它不是一個字串型別(REG_SZ 或者 REG_EXPAND_SZ),則嵌入這個值。 

如果你希望包括一個逗號,豎線(字元“|”)或大括號閉弧“}”在常量裡面,你必須通過“%-編碼” 形式用“%”後緊跟一個兩位的16進位制程式碼轉譯後替換原來的字元,一個逗號是“%2c”,一個豎線符是“%7c”,一個大括號閉弧是“%7d”  DefaultValue 可以包括常量,然而,如上所訴內嵌的常量的大括號的閉弧 

“}” 必須被改成“%7d”才可以。

7{srcexe}  

安裝程式的檔名全稱(包括全程路徑和檔名),例如“C:"SETUP.EXE” 

8{username}  

執行安裝程式的使用者的名稱(函式 GetUserName 的返回值)。

二.指令碼的段

       Inno Setup的指令碼的段分為幾段,下面看一個Inno Setup自帶的例子:Example1.iss,其內容如下:

; -- Example1.iss --

; Demonstrates copying 3 files and creating an icon.

; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES!

[Setup]

AppName=My Program

AppVerName=My Program version 1.5

DefaultDirName={pf}"My Program

DefaultGroupName=My Program

UninstallDisplayIcon={app}"MyProg.exe

Compression=lzma

SolidCompression=yes

OutputDir=userdocs:Inno Setup Examples Output

[Files]

Source: "MyProg.exe"; DestDir: "{app}"

Source: "MyProg.chm"; DestDir: "{app}"

Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]

Name: "{group}"My Program"; Filename: "{app}"MyProg.exe"

       從上面可以看出,iss檔案是由一段一段的指令碼組成的,例如,在上例中寫了三段,分別為:[Setup][Files][Icons]

在本小節中只是粗略的介紹一下這幾段的作用,至於具體每一段的使用,在本小節不予講述。

1. [Setup]  

       這個段包括了安裝和解除安裝程式所使用的全域性設定,並且有些關鍵字在你建立的安裝程式中是必須要用到的。

2. [Dirs] 

       這個段是可選的,而且通常對於大多數簡單的應用程式來書不是必需的。這個段是用來建立除使用者選擇的應用程式目錄以外的其它的附加的目錄,它是被自動建立的。這個段所建立的子目錄是可以脫離主應用程式而共同使用的目錄。當然在 [Files] 段裡面的檔案被複制到某個目錄之前你並不一定要建立它,然而在解除安裝程式的時候在 [Dirs]  [UninstallDelete] 段裡面沒有指定的目錄就不會被刪除。

3. [Files]  

這個段是可選的,但對於大多數安裝程式來說是必不可少的。在這裡定義了安裝程式需要複製到使用者的系統當中的全部檔案。 

在安裝期間,解除安裝程式和資料被自動的複製到應用程式的目錄當中去,因此你不必手工的將它們新增到 [Files] 段。

4.[Icons] 

這個段是可選的,但對於大多數安裝程式來說是必不可少的。它定義了所有的安裝程式要在使用者系統中建立的程式管理器/開始選單的圖示。它也能被用來在其它的位置建立應用程式圖示(快捷方式),比如就像桌面。 

解除安裝圖示是由安裝程式內部建立的,這樣一來你就不需要在 [Icons] 段裡面手工的新增它。預設情況下,安裝程式執行在 Windows 95/NT 4+ 的時候是不建立解除安裝圖示的 ――除了安裝程式運行於 Windows NT 3.51 的時候。 要強制建立一個解除安裝圖示,請使用 [Setup] 段裡面的 AlwaysCreateUninstallIcon 關鍵字。

5.[INI]  

此段是可選的,它定義了一些 .INI 檔案項,在檔案被複制以後安裝程式在使用者的系統中的設定。  

6.[InstallDelete] 

它使用的是和 [UninstallDelete] 段相同的格式,不同的是它是在安裝程式的第一步被處理的。 

7.[Messages]  

[Messages] 段是用於定義安裝程式和解除安裝程式所顯示的訊息。通常你不需要在你的指令碼檔案裡面建立 [Messages] 段,預設情況下所有的顯示訊息都由 Inno Setup 包含的檔案 Default.isl 定義。 (或由 [Setup] 段的關鍵字 MessagesFile 指定的任何檔案)。

8. [Registry] 

這個段是可選的,他定義了一些登錄檔項,用於在複製完檔案之後建立在使用者的系統中。 

9.[Run]  & [UninstallRun]  

[Run] 段是可選的,指定任意數量的程式在成功安裝程式以後及顯示結束對話方塊之前被執行。同樣 [UninstallRun] 段也是可選的,指定任意數量的程式在解除安裝程式的第一步時被執行。除非下面有其它說明,兩個段共有相同的語法。 
每個程式按照你的指令碼編排的順序被執行,當出路 [Run]/[UninstallRun] 的項時,安裝程式將會等到當前的程式終止之後才處理下一個,當然除非使用了 nowait 標記。

10.[UninstallDelete]  

該段是可選的。該段是用來定義一些附加的除了那些被安裝的應用程式之外的要被解除安裝程式刪除的檔案或目錄。使用該段來刪除由你的應用程式建立的 .INI 檔案是一個常用的辦法。解除安裝程式在解除安裝過程的最後一步處理這些項。

11.[CustomMessages] 段
[CustomMessages] 段用於定義 {cm:...} 常量的自定義訊息值。查閱常量幫助文件內容獲取更多資訊。
從 [CustomMessages] 段使用 {cm:...} 常量獲取的帶描述的任務示例: 
[CustomMessages] 
createDesktopIcon=建立桌面快捷方式(&D)
[Tasks] 
Name: desktopicon; Description: "{cm:createDesktopIcon}"

三.註釋和段內參數

       Inno Setup中將以“;”開始的行作為註釋行,例如在上小節中的Example1.iss中的前幾行都是該例的註釋行。

       指令碼檔案中的所有的段,除了[Setup],都是以行位單位,每行分為若干個引數。例如Example1.iss[Files]段內容如下:

[Files]

Source: "MyProg.exe"; DestDir: "{app}"

Source: "MyProg.chm"; DestDir: "{app}"

Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

       從上面的指令碼程式碼可以看出,每個引數都有一個名稱,例如SourceDestDir,後面緊跟一個冒號,然後是它的值。當一行有多個引數時,引數之間則用分號(;)隔開。

引數的值多數情況下是用引號擴起來("),但使用引號也是可選的。然而如果這個引數的值裡面的前導符號或者字尾符號是空格的話就必須加上引號了。另外需要說明的是使用內嵌的分號和引號,要插入一個引號則使用兩個連續的引號來代替。

四.簡單例項講解

       在本小節中,我們講述Inno Setup中的一個簡單例子,即前面各節提及的Example.iss。首先看一下[Files]

[Setup]

AppName=My Program

AppVerName=My Program version 1.5

DefaultDirName={pf}"My Program

DefaultGroupName=My Program

UninstallDisplayIcon={app}"MyProg.exe

Compression=lzma

SolidCompression=yes

OutputDir=userdocs:Inno Setup Examples Output

       上述指令碼程式碼中,AppName為應用程式的名稱,在Inno Setup5.1.8中,點選執行按鈕執行時,可以看到在安裝視窗的左上角顯示的是應用程式的名稱,視窗如下所示:
    

       AppVerName為應用程式的版本號,也是在安裝嚮導的首頁顯示的。DefaultDirName為預設的路徑,點選上圖的“繼續”按鈕,安裝視窗如下:
   

       DefaultDirName即為上圖中的預設的安裝路徑。

Compression表示壓縮的型別,指示現在預設為lzma。基本上在所有的例項中,lzma壓縮較其它支援的壓縮方法好。先前預設為 zip(ML)可執行檔案現在壓縮率更高。

DefaultGroupName表示的是開始選單資料夾,在上圖中點選“繼續”按鈕,進入的視窗如下:
   

相關推薦

Inno Setup使用

   說明:本文用的Inno Setup的版本是5.1.8。示例程式位於Inno Setup V5.18安裝目錄"Examples目錄下。本文對筆者轉載的一篇文章《Inno Setup使用教程》根據筆者實際工作中用到的東西進行縮減和修改而成。 一.介紹 Inno Setu

mysql mysql備份

mysql備份的目的: 實現災難恢復:誤操作、硬件故障、軟件故障、自然災害、黑客攻擊 註意的要點: 1、能夠容忍丟失多少數據 2、恢復數據所用的時間 3、備份需要的時間 4、是否對業務有影響 5、備份時服務器負載 備份類型 完全備份:備份整個

函數

並行 自己的 習題 文件 false 聲明 方式 關鍵字 true 1.命名空間 本質:存放名字與值的綁定關系 命名空間的分類:(1)全局命名空間(變量)->位於函數體外 (2)局部命名空間(變量)->

Redis高級

具體類 tro 類型 長度 刪除過期數據 專用 影響 生活 設置時間 一、redis中的事務 在關系型數據庫中事務是必不可少的一個核心功能,生活中也是處處可見,比如我們去銀行轉賬,首先需要將A賬戶的錢劃走,然後存到B賬戶上,這兩個步驟必須在同一事務中,要麽都執行,要麽都不執

SQL ServerT-SQL查詢和編程的背景

.com src 編程 server 分享 bubuko 進階 分享圖片 img SQL Server進階(一)T-SQL查詢和編程的背景

Redis高階

一、redis中的事務 在關係型資料庫中事務是必不可少的一個核心功能,生活中也是處處可見,比如我們去銀行轉賬,首先需要將A賬戶的錢划走,然後存到B賬戶上,這兩個步驟必須在同一事務中,要麼都執行,要麼都不執行,不然錢憑空消失了,換了誰也無法接受。 同樣,redis中也為我們提供了事務,原理是:先把一組同一事

SpringCloud從入門到——懂生活就懂微服務

避免 發現 官方文檔 隨著 並發 規範 只需要 組合 組件 內容   本文通過生活中的實際場景解釋單體應用和微服務應用的關系,以及SpringCloud中各組件的功能和含義。 適合人群   Java開發人員 說明   轉載請說明出處:SpringCloud從入門到進階(一)

Servlet第一個JSP頁面

前言       本章講解JSP的相關知識之JSP初步 方法 1.概念 在以前我們寫網頁的時候,都是用html進行書寫,這種網頁是靜態的,無法和伺服器進行一個互動,那麼怎麼辦呢?JSP技術應運而生,我們在web開發之中,Java和Jsp可以形成完美的

JavaScriptJS事件機制

前言       做了這麼久的鋪墊,終於迎來了新的篇章,該章介紹JS中的事件機制 方法 1.概念 我們知道,JS是參與網頁互動的一門指令碼語言,之前所說的都是JS的基本概念,那麼怎麼來進行互動呢!那就需要JS的事件機制來進行控制了,如按鈕的點選事件觸

Android: Launcher啟動過程

1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而且很容易看懂,非常推薦大家去看看(沒有收廣告費,單純覺得作者寫的很好)。 今天就將 Launcher 系統啟動過程 總結一下(基於Android 8.0 系統)。 文章

c語言指標

指標也是一種資料型別 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。 1)指標是一種變數,佔有記憶體空間,用來儲存記憶體地址

C# Lambda 表示式

Lambda 表示式是一種可用於建立委託或表示式目錄樹型別的匿名函式。通過使用 lambda 表示式,可以寫入可作為引數傳遞或作為函式呼叫值返回的本地函式。 Lambda 表示式對於編寫 LINQ 查詢表示式特別有用。若要建立 Lambda 表示式,需要在 Lambda 運算

egg.js-基於koa2的node.js

一、路由進階Egg路由的路由重定向,路由分組 在router.js修改為如下格式require引用 module.exports = app => { const { router, controller } = app; require('./routers/admin')(app); re

python3.5-------------------網路通訊ip、埠,socket

1. ip地址:如198.168.1.1 ,用於在網路中標記區分每臺電腦,在本地區域網中是唯一的。window下程式->cmd->輸入ipconfig(檢視ipv4就是ip地址)。拓展:ip v4表示ip的第四個版本,目前出現了ipv6,ipv1/2/3/5都

PyQt5——讓視窗裝載更多的控制元件

1. QTabWidget的使用 視窗上側有標籤,選擇不同標籤進入不同佈局頁面 import sys from PyQt5.QtWidgets import * class TabDemo(QTabWidget): def __init__(self, parent=No

Android----MVP架構

相信大家一定在用mvp架構去設計App,但是在設計運用的過程中,大家有沒有考慮簡化程式碼,View層和Model層會有很多重複的程式碼,在顯示資料之前還需每次判斷View!=null,Presenter層每次需要去new Model層的例項,View層還有可能會對應多個Presenter

java:泛型

1、泛型簡介 所謂泛型,即通過引數化型別來實現在同一份程式碼上操作多種資料型別,泛型程式設計是一種程式設計正規化,他利用“引數化型別”將型別抽象化,從而實現更為靈活的複用。 先簡單給個例子: //可以想象這裡的T為Integer型別,以便於理解,其實它可以是任何型別 p

學習筆記之MongoDB

MongoDB的條件操作符 MongoDB中條件操作符有: (>) 大於 - $gt (<) 小於 - $lt (>=) 大於等於 - $gte (<= ) 小於等於 - $lte $gt -------- greater than

Kotlin系統入門與

一、什麼是Kotlin? Kotlin就是一門可以執行在Java虛擬機器、Android、瀏覽器上的靜態語言,他與Java 100%相容,如果對Java熟悉,可以發現Kotlin擁有自己

屬性動畫2:ValueAnimator高階

1. 概述 前面一篇屬性動畫1:基礎知識和ValueAnimator寫完,我對屬性動畫基礎知識和ValueAnimator的簡單用法有了一些瞭解。要想把屬性動畫吃透,我感覺需要更加深入的學習。現在,就從ValueAnimator的高階進階開始,繼續攻克