1. 程式人生 > >inno setup技巧篇

inno setup技巧篇

介紹

Inno setup 是一個免費的windows安裝程式製作軟體.windows 98,2000,XP,NT4.0,Me以及更高的版本均可使用.
軟體打包中常用到的功能有:
*定製安裝方式,如:自定義安裝,完全安裝
*擁有自由可控的解除安裝功能
*建立快捷方式,包括開始選單和桌面
*建立登錄檔和.ini專案
*支援密碼加密
*後臺安裝和後臺解除安裝
*安裝前和安裝後執行一系列活動,比如檢測登錄檔是否存在或寫入登錄檔,檢測程序是否執行,檢測檔案版本
*檔案壓縮,支援bzip2、7-Zip 、lzma格式的壓縮.安裝程式可以比較檔案版本資訊,替換正在使用的檔案

市面上的很多軟體都在使用此款軟體作為安裝包工具, 例如: bandicam ,迅雷,notepad++,foxmail, FileZilla,PotPlayer,navicat等等……
因為打包快捷,而且可以自己開發外掛(.dll)放進去使用.

提前預習

基本的使用方式百度上搜的話能搜出一大堆比如搜”inno setup打包工具使用” “inno setup指令碼編寫”,但是簡單使用的方式,有時候會滿足不了客戶的特殊需求,所以這次要講的是百度上有點難搜到,而且是我從入職以來到至今的寫安裝包的經驗總結出來的幾點技巧.

  1. inno setup指令碼分為幾個段落 ,這幾個段落需要記住;
  2. [setup],該段包含用於安裝程式和解除安裝程式的全域性設定。某些指令對於你建立的任何安裝程式都是必需的;
  3. [Icons] ,這個可選段定義所有穿件在開始選單和其他位置(比如桌面)快捷方式;
  4. [Languages] ,用來定義安裝程式中可使用的語言;
  5. [UninstallRun]
    ,同樣是可選的,用來指定在解除安裝第一步要執行的一些程式.除在下面有註釋的外,兩個段使用相同的語法;
  6. [Registry] ,這個可選段用來定義一些你想用安裝程式在使用者系統中建立、修改或刪除的登錄檔鍵/值;
  7. [Tasks] ,這個段是隻選的。它定義安裝程式在執行安裝期間所有由使用者定製的任務。這些任務以選項框和單選項形式在附加任務嚮導頁面中出現;
  8. [UninstallDelete] ,該可選段定義你要解除安裝程式刪除的任何附加檔案或目錄,除了那些用 [Files] 或 [Dirs] 段條目安裝/建立的以外。刪除由應用程式建立的 .INI 檔案,對於該段是常用的一種方法。該解除安裝程式處理這些項作為解除安裝的最後一步;
  9. [Dirs],這個可選段用來定義除建立使用者選擇的應用程式目錄外安裝程式自動建立的另外目錄。在主應用程式目錄下建立子目錄對於這個段是公共使用的;
  10. [INI],這個可選段用來定義除建立使用者選擇的應用程式目錄外安裝程式自動建立的另外目錄。在主應用程式目錄下建立子目錄對於這個段是公共使用的;
  11. [LangOptions],用於定義特殊語言設定,象字型一樣,被安裝程式和解除安裝程式使用。通常,你不需要在指令碼檔案中建立 [LangOptions] 段,按預設值,由於特殊語言設定在 Inno Setup 的 Default.isl 檔案(或由 [Languages] 段條目指定的那個檔案)中已經包含

上述內容都可以在附件的 Isetup.chm文件中找到….

技巧內容

1.修改介面上的提示語

開始介面上的提示內容修改,主介面上的內容可以分為兩塊,如圖畫藍線的和畫紅線的
在這裡插入圖片描述
畫藍線的在指令碼中應該修改的位置, 是[setup]下的AppName和AppVersion如下圖:
在這裡插入圖片描述
畫紅線的在指令碼中預設是不顯示的,修改的話需要自己加上[Messages],下面的各種屬性需要到百度找, 附件中是我從百度下載下來的[Messages]的屬性列表

效果如下:
在這裡插入圖片描述
在這裡插入圖片描述
安裝完成頁面上的提示語修改
在這裡插入圖片描述
在這裡插入圖片描述
還有其他介面上的內容也可以修改如:
準備介面(wpReady)
licence介面(wpLicense)
選擇選單分組介面(wpSelectProgramGroup)
選擇安裝路徑介面(wpSelectDir)
自定義介面的話可以在建立介面時在[code]裡直接修改,如圖
在這裡插入圖片描述
在這裡插入圖片描述
例子就講到這裡,還有很多屬效能修改,需要的可以從附件中拿到[Message]中的屬性,這些屬性都可以在……/inno/Default_cn.isl 這個檔案中找到,是語言庫…
指令碼中也可以自己選取使用某個語言庫,如圖:
在這裡插入圖片描述
[Code]中的自定義介面建立就請參考CodeClasses.iss,這是innosetup自帶的example指令碼,附件裡找到

2.自動指定上一次安裝的路徑

這個功能安裝包指令碼[setup]裡已經有提供有這個屬性。
UsePreviousAppDir = yes 時會自動跳過安裝目錄選擇介面直接安裝到上次安裝的目錄下
指令碼是根據安裝包的AppId這個屬性來判斷是不是跟上次安裝的安裝包相同.

3. 安裝時控制安裝的路徑,但是顯示上次安裝的路徑

這跟2有稍微的區別,就是能看到上次安裝的目錄在此基礎上可以選擇安裝路徑.
這裡就能用到inno的[Code]段中的函式.如圖:
在這裡插入圖片描述
DefaultDirName是指安裝的預設路徑
{code:GetPath|Client} 中code:GetPath 是[code]段中自己寫的一個可以讀登錄檔的函式,|Client是引數,如果沒有引數就寫成{code:GetPath}即可.
[Code]段中的函式可以出現在整個指令碼的任何位置,不在[Code]段中時需要使用 {code:xxxx} 這種呼叫方式.需要注意的是[Code]段中的函式中的任何變數,必須是已經有值的變數才行,不然執行時會報錯. 需要保證這些變數有值就需要在[Code]段中寫下初始化的函式

function InitializeSetup(): Boolean;
在安裝程式初始化時呼叫,返回 False 中斷安裝,否則返回 True。
procedure InitializeWizard();
在啟動時使用該事件函式來改變嚮導或嚮導頁面。你不能在它被觸發時使用 InitializeSetup 事件函式,因為嚮導窗體尚不存在。
一般是用InitializeSetup函式就可以了.
Inno有內建的讀取登錄檔的功能函式RegQueryStringValue,應用舉例程式碼看

function GetPath(Param: String): String;
var
    strPath: String;
    sFloader:String;
    sdefaultpath:String;
begin
    strPath := '';
    sdefaultpath :='C:\Program Files\xxxxx';
    if Param = 'Client' then
    begin
	  sFloader := 'Software\xxxxx';
	  sdefaultpath := 'C:\Program Files\xxxxx';
    end
    if Param = 'Server' then
    begin
	  sFloader := 'Software\xxxxx';
	  sdefaultpath := 'C:\Program Files\xxxxx';
    end
    if (RegQueryStringValue(HKEY_LOCAL_MACHINE, sFloader, 'Path', strPath))then
    begin
		Result := strPath;
    end
    else
    begin
        Result :=sdefaultpath;
    end
end;

在這裡插入圖片描述
在這裡插入圖片描述

4.解除安裝完成後不殘留檔案

[UninstallDelete]
Name: {app}; Type: filesandordirs; Languages:
加上這段程式碼,表示解除安裝後刪除檔案和目錄.可以在附件1中的ISetup.chm文件中搜索UninstallDelete來執行更多的刪除操作,刪除時能刪除好多好多東西……

5.安裝時執行批處理檔案

安裝時執行批處理檔案,這樣就能把windows中的批處理的強大功能匯入到了安裝解除安裝過程中,實現過安裝時備份功能,安裝時刪除,安裝時移動等等功能……
此功能是在[Code]段中實現的,因為[Code]段中的程式碼能在整個指令碼中的任何位置執行.下面是批處理檔案的引數,檔名,工作目錄的寫法:
ShellExec(’’,ExpandConstant(sBatName), sBatParams,sBatPath, SW_HIDE, ewWaitUntilTerminated, ResultCode);
第一個引數: 這個不太懂,就寫成空字串就行了. 注:inno中字串是單引號(‘’)來擴住的
第二個引數: ExpandConstant(sBatName)中ExpandConstant()是更改所有在sBatName中的常量到它們的值。例如,ExpandConstant(’{pf}’)是改變到安裝程式的檔名,簡單來說就是更改inno中的常量(巨集)的字串讓ShellExec這個函式認識這個引數. sBatName:=’xxxx.bat’這樣就行了.
第三個引數: sBatParams:=’”’ + 引數 + ‘”’ . 其中”雙引號是為了防止執行批處理時出現錯誤,單引號擴住雙引號,我試過 sBatParams := ‘引數’ ,結果引數中包含空格,執行批處理時一直失敗.
第四個引數: sBatPath 同理 跟第三個引數相同的思路.
第五個引數: SW_HIDE表示執行時隱藏cmd視窗, SW_SHOW表示執行時顯示此視窗
第六個引數: ewNoWait, ewWaitUntilTerminated, ewWaitUntilIdle分別表示:不等待cmd執行完成,等待cmd執行完成,等待使用者輸入直到超時時間.
第七個引數: 這個引數是返回結果,結果為0除外的都是錯誤,具體錯誤原因可以查MSDN
例子.
檔案備份舉例.rar指令碼可以完成的打出一個安裝包,也包含很多其他的內容,所以開啟安裝包之後直接ctrl+f搜尋 BackDir , BackFile即可快速找到函式.

6.安裝包製作過程中怎麼除錯

Innosetup預設支援除錯功能,跟vs2008編譯器差不多,先打斷點然後點選單步步入或單步步過,執行到斷點之後點選F8就是繼續,點選F7就是進入到函式裡面繼續,如圖:
在這裡插入圖片描述

7.控制面板中安裝包顯示的名字

修改[Setup]段中
Uninstallable: yes表示有解除安裝程式,no表示沒有
UninstallFilesDir: 表示解除安裝程式放置的路徑
UninstallDisplayName: 表示解除安裝程式的顯示名稱

在這裡插入圖片描述

8.指令碼中使用其他外掛(.dll)的方法

舉例使用IsTask.dll這個外掛
在[Setup]段中寫入
Source: compiler:IsTask.dll; Flags: dontcopy noencryption
Source: inno\IsTask.dll; DestDir: {app}\
其中DestDir:{app}\ 表示此外掛安裝後的 dll放置路徑.

在[Code]段中任意位置,先匯入函式
function KillTask(ExeFileName: string): Integer;
**external ‘[email protected]:ISTask.dll stdcall delayload’; **

在[Code]段中使用函式,匯入過程必須放在使用前面,不然識別函式失敗
KillTask(‘tomcat7.exe’);

9.指令碼太長時,include方式整理指令碼

Include可以說是直接把這段程式碼複製到這個位置一樣,可以把通常不用修改的內容解除安裝裡面
Include可以用在整個指令碼的任何位置.
在這裡插入圖片描述
比如這些也可以另外建立一個檔案寫進去然後在用include匯入.
在這裡插入圖片描述

總結(工具連結)

生活愉快 ~\(^o^)/~

inno setup 5 下載連結.