Windows下使用Inno Setup 製作exe安裝包
Inno Setup 詳解中文資料
其一:使用教程
一、Inno Setup 是什麼?
InnoSetup 是一個免費的 Windows 安裝程式製作軟體。第一次發表是在 1997 年,Inno Setup 今天在功能設定和穩定性上的競爭力可能已經超過一些商業的安裝程式製作軟體。
二、Inno Setup 能幹什麼?
1.支援現在所有正在使用的 Windows 版本: 7, 2008 R2, Vista, XP, 2008,2003, 2000, Me, 98, 95, 和 NT 4.0 (不需要服務包)。
2.廣泛支援在 64 位 的 Windows XP and Windows Server2003 版本的作業系統中的 64 位應用程式安裝。支援 x64 和 Itanium 兩個結構。(在 Itanium 結構中,必須在 64 位模式安裝 Service Pack 1。)
3.支援建立單個EXE 格式的安裝程式,使你的程式可以很方便地在網路上發表。同時也支援磁碟延伸。
4.標準的Windows 2000/XP 樣式嚮導介面。
5.定製安裝型別,例如:完整安裝,最小安裝,自定義安裝。
6.完整的解除安裝功能。
7.檔案安裝:
包括完全的“壓縮”支援,bzip2 和 7-Zip LZMA 檔案壓縮。安裝程式可以比較檔案版本資訊,替換正在使用的檔案,使用共享檔案計數,註冊DLL/OCX 和型別庫,以及安裝字型。
8.可以在任意地方建立快捷方式,包括開始選單和桌面。
9.建立登錄檔 和.INI 條目。
10.在安裝之前、之中或之後可執行其他程式。
11.支援多語言安裝。
12.支援密碼和加密安裝。
13.支援數字簽名 、安裝和解除安裝。
14.後臺安裝和後臺解除安裝。
15.Unicode安裝。(Windows 2000/XP 或更高)
16.完整的Pascal 指令碼 引擎選項於執行期高階自定義安裝和解除安裝。
17.全部原始碼公開(Borland Delphi 2.0-5.0 和 2009)。
二、建立安裝程式的方式:指令碼
安裝程式用編譯指令碼的方式建立,指令碼其實就是一個類似.INI 檔案格式的 ASCII 碼文字檔案。(它不象你想象的那麼複雜!)。 Unicode Inno Setup支援 UTF-8 編碼文字檔案。
指令碼用一個“.iss”(表示 Inno Setup Script指令碼) 的副檔名。指令碼控制著安裝程式的所有方面。由它指定哪些檔案將被安裝到什麼地方,在哪裡建立快捷方式,且被命名為什麼。
指令碼檔案一般可以用安裝程式編譯器程式內建的編輯器進行編輯。在你編寫完指令碼後,下一個最終步驟就是選擇安裝程式編譯器中的“編譯”。建立完成後,就可以執行根據你指令碼編譯的安裝程式了。按預設,這個安裝程式建立在包含指令碼檔案目錄下的名為“輸出”目錄中。
如果你想看看它是怎樣工作的,啟動安裝程式編譯器,單擊“檔案 | 開啟”,並選擇位於 Inno Setup 安裝目錄下的Examples 子目錄中的一個指令碼檔案。(你也可以將這些示例指令碼作為你自己編寫指令碼的模板。)
Inno setup指令碼示範(註釋)
[Setup]
;程式名
AppName=ISsample
;版本號
AppVerName=ISsample 1.0.0.0
;釋出者名
AppPublisher=Hkiss
;相關連線
AppPublisherURL=http://www.yan.com/
AppSupportURL=http://www.yan.com/
AppUpdatesURL=http://www.yan.com/
;預設安裝目錄
DefaultDirName={pf}\ISsample
;預設開始選單名
DefaultGroupName=ISsample
;是否開啟->可選安裝開始選單項
;AllowNoIcons=yes
;安裝協議
;LicenseFile=C:\Example\原始檔案\agreement.txt
;安裝前檢視的文字檔案
;InfoBeforeFile=C:\Example\原始檔案\Setup_New.txt
;安裝後檢視文字檔案
;InfoAfterFile=C:\Example\原始檔案\Setup_Old.txt
;輸出資料夾
OutputDir=C:\Example\InnoSetup\out
;輸出檔名
OutputBaseFilename=setup
;安裝圖示
SetupIconFile=C:\Example\原始檔案\title.ico
;安裝需要輸入密碼
;Password=123
;Encryption=yes
;壓縮相關
Compression=lzma
SolidCompression=yes
;可以讓使用者忽略選擇語言相關
ShowLanguageDialog = yes
;備註版本資訊
VersionInfoCompany=HTTP://www.Hkiss.COM
VersionInfoDescription=ISsample漢化增強版
VersionInfoVersion=1.0.0.0
VersionInfoCopyright=Copyright(C) 2007-2008 Hkiss
;製作選擇語言
[Languages]
Name: "chs";MessagesFile: "compiler:Default.isl" ;LicenSeFile :"C:\Example\原始檔案\chs\agreement.txt"
Name: "en";MessagesFile: "compiler:Languages\English.isl";LicenSeFile:"C:\Example\原始檔案\en\agreement.txt"
;使用者定製任務
[Tasks]
Name: "desktopicon";Description: "{cm:CreateDesktopIcon}"; GroupDescription:"{cm:AdditionalIcons}"; Flags: unchecked
Name:"quicklaunchicon"; Description:"{cm:CreateQuickLaunchIcon}"; GroupDescription:"{cm:AdditionalIcons}"; Flags: unchecked
Name: "Tasks_1" ;Description:"使用者自定義任務1"; Flags: unchecked
Name: "Tasks_2" ;Description:"使用者自定義任務2"; Flags: unchecked
;選擇了元件才會出現的定製任務
Name: "Tasks_3" ;Description:"使用者自定義任務3";Components: c1 ; Flags: unchecked
;檔案安裝
[Files]
;多語言安裝環境設定 公共引數Languages 來設定
Source: "C:\Example\原始檔案\enfile.txt"; DestDir:"{app}"; Languages: en ; Flags: ignoreversion
Source: "C:\Example\原始檔案\chsfile.txt"; DestDir:"{app}"; Languages: chs ; Flags: ignoreversion
;使用者自定義任務 Tasks
Source: "C:\Example\原始檔案\Tasks\tasks_1.txt";DestDir: "{app}\Tasks"; Flags: ignoreversion ;Tasks : Tasks_1
Source: "C:\Example\原始檔案\Tasks\tasks_2.txt";DestDir: "{app}\Tasks"; Flags: ignoreversion ;Tasks :Tasks_2
Source: "C:\Example\原始檔案\Tasks\tasks_Components.txt";DestDir: "{app}\Tasks"; Flags: ignoreversion ;Tasks :Tasks_2
;使用者定義元件安裝
Source: "C:\Example\原始檔案\Components\Components_1.txt";DestDir: "{app}\Components"; Flags: ignoreversion ; Components: a1;
Source: "C:\Example\原始檔案\Components\Components_2.txt";DestDir: "{app}\Components"; Flags: ignoreversion ; Components: a2;
Source: "C:\Example\原始檔案\Components\Components_3.txt";DestDir: "{app}\Components"; Flags: ignoreversion ; Components: a3;
Source: "C:\Example\原始檔案\Components\Components_4.txt";DestDir: "{app}\Components"; Flags: ignoreversion ; Components: a1 a2a3;
;使用者註冊自定義Dll檔案 regserver 註冊 noregerror 不顯示錯誤資訊
Source: "C:\Example\原始檔案\jmail.dll"; DestDir:"{app}"; Flags: ignoreversion regserver
;新增自述檔案
Source: "C:\Example\原始檔案\ISsample.txt"; DestDir:"{app}"; Flags: ignoreversion
;新增一個檔案到快取資料夾{Tmp} deleteafterinstall 安裝後刪除
Source: "C:\Example\原始檔案\test.exe"; DestDir:"{tmp}"; Flags: ignoreversion deleteafterinstall
Source: "C:\Example\原始檔案\ISsample.chm"; DestDir:"{app}"; Flags: ignoreversion
Source: "C:\Example\原始檔案\ISsample.exe"; DestDir:"{app}"; Flags: ignoreversion
Source: "C:\Example\原始檔案\ISsample.dll"; DestDir:"{app}"; Flags: ignoreversion
Source: "C:\Example\原始檔案\ISsample.ini"; DestDir:"{app}"; Flags: ignoreversion
Source: "C:\Example\原始檔案\ISsample.rar"; DestDir:"{app}"; Flags: ignoreversion
Source: "C:\Example\原始檔案\ISsample_sys.dll"; DestDir:"{win}\System32"; Flags: ignoreversion
Source: "C:\Example\原始檔案\log\*"; DestDir:"{app}\log"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系統檔案上使用“Flags:ignoreversion”
;安裝型別設定
[Types]
Name: Full ;Description:"完全安裝"; Flags: iscustom
Name: Compact ;Description:"簡潔安裝";
Name: Custom; Description:"自定義安裝";
;元件安裝
[Components]
Name: c1; Description: "自定義任務3" ; Types: Full
Name: a1; Description: "安裝Components_1"; Types: FullCompact Custom ;
Name: a2; Description: "安裝Components_2"; Types :Full Compact
Name: a3; Description: "安裝Components_3"; Types : Full
;開始選單,桌面快捷方式
[Icons]
Name:"{group}\ISsample"; Filename: "{app}\ISsample.exe"
Name:"{group}\{cm:ProgramOnTheWeb,ISsample}"; Filename:"http://www.yan.com/"
Name:"{group}\{cm:UninstallProgram,ISsample}"; Filename:"{uninstallexe}"
Name:"{commondesktop}\ISsample"; Filename: "{app}\ISsample.exe";Tasks: desktopicon
Name:"{userappdata}\Microsoft\Internet Explorer\Quick Launch\ISsample";Filename: "{app}\ISsample.exe"; Tasks: quicklaunchicon
;新增一個幫助文擋
Name: {group}\ISsample 1.0.0.0 幫助文件;Filename: {app}\ISsample.chm
;用來在程式安裝完成後 在安裝程式顯示最終對話方塊之前執行程式 常用與執行主程式 顯示自述檔案刪除臨時檔案
[Run]
Filename:"{app}\ISsample.exe"; Description:"{cm:LaunchProgram,ISsample}"; Flags: nowait postinstall skipifsilent
Filename:"{app}\ISsample.txt"; Description: "檢視顯示自述檔案"; Flags: postinstallskipifsilent shellexec
;更改顯示在程式中顯示的訊息文字
[Messages]
BeveledLabel=HKiss科技
;解除安裝對話方塊說明
ConfirmUninstall=您真的想要從電腦中解除安裝ISsample嗎?%n%n按 [是] 則完全刪除 %1 以及它的所有元件;%n按 [否]則讓軟體繼續留在您的電腦上.
;定義解壓說明
;StatusExtractFiles=解壓並複製主程式檔案及相關庫檔案...
;用與在使用者系統中建立,修改或刪除登錄檔健值
[Registry]
Root: HKLM;SubKey:"Software\ISsample";ValueType:dword;ValueName:config;ValueData:10;Flags:uninsdeletevalue
;在執行指令碼
;注意:下面是code,因為與論壇使用的程式碼標籤重名,改為了c0de,需要改回去。
[c0de]
//全域性變數
var MyProgChecked: Boolean;
//判斷程式是否存在
//初始華程式事件
function InitializeSetup():boolean;
var Isbl: boolean; //宣告變數
var Isstr: string;
begin //開始
Isbl := true; //變數賦值
Isstr := '歡迎';
ifRegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\ISsample', 'config') then
begin
MsgBox('已安裝過,請先解除安裝在安裝',mbConfirmation, MB_OK);
isbl := false;
end else
begin
//MsgBox('無值',mbConfirmation, MB_OK);
isbl := true;
end;
//下面是個麻煩的 條件語句 end else 注意
//if MsgBox(Isstr,mbConfirmation, MB_OKCANCEL) = IDOK then
//begin
// isbl := true;
// MsgBox('執行了', mbConfirmation, MB_OK);
//end else
//begin
// isbl := false;
//MsgBox('執行了', mbConfirmation, MB_OK);
//end;
Result := Isbl;
end; //結束
procedure CurStepChanged(CurStep:TSetupStep);
var Isstr :string;
begin
if CurStep=ssInstall then //實際安裝前呼叫
begin
//MsgBox('CurStepChanged:實際安裝前呼叫', mbConfirmation,MB_OKCANCEL); //安裝完成後呼叫
end;
if CurStep=ssPostInstall then
begin
Isstr := ExpandConstant('{tmp}\tmp.rar');
// if FileExists(Isstr) then
// begin
// MsgBox('檔案存在',mbConfirmation, MB_OK);
// end else
// begin
// MsgBox('檔案不存在',mbConfirmation, MB_OK);
// end;
// MsgBox('CurStepChanged:實際安裝後呼叫', mbConfirmation, MB_OKCANCEL);
end;
end;
//下一步 按鈕按鈕 事件
function NextButtonClick(CurPageID:Integer): Boolean;
var ResultCode: Integer;
var IsSetup : Boolean;
begin
IsSetup := true ;
case CurPageID of
wpSelectDir:
MsgBox('NextButtonClick:' #13#13 'Youselected: ''' + WizardDirValue + '''.', mbInformation, MB_OK); //WizardDirValue路徑
wpSelectProgramGroup:
MsgBox('NextButtonClick:' #13#13 'Youselected: ''' + WizardGroupValue + '''.', mbInformation, MB_OK); //開始選單名
wpReady:
begin
if notRegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Test', 'config') then begin
if MsgBox('程式執行需要Test.ext,是否安裝!', mbConfirmation, MB_YESNO) =idYes then begin
ExtractTemporaryFile('test.exe');
if notExec(ExpandConstant('{tmp}\test.exe'), '', '', SW_SHOWNORMAL,ewWaitUntilTerminated, ResultCode) then
MsgBox('Test.exe出錯:' #13#13 ' ' +SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
end else begin
IsSetup := false ;
end ;
BringToFrontAndRestore();
end;
end;
end;
Result := IsSetup;
end;
三.指令碼格式概述
Inno Setup 指令碼大致上分成若干的段,各段掌管不同的功能。每個段控制安裝程式部分的某個不同方面。每個段用包含在中括號“ [] ”中的段名開始,每個段裡面是一些相關的條目。
其中有兩種不同主要型別的段:有些就象 [Setup] 段,條目包含指令名和值 (格式為 Directive=Value),還有一些就象 [Files] 段,條目被引數分隔。
這裡是一個例子:
[Setup]
AppName=My Program
[Files]
Source: "MYPROG.EXE"; DestDir:"{app}"
注意,在指令碼中指定多個相同名字的段是合法的。
你可以通過在行起始位置加個分號“;”在指令碼中寫入“註釋” (編譯時被編譯時忽略)。例如:
; 這是一條註釋,放在這裡只是要提醒我自己...
支援 AC-like #include 指令,從個別檔案放入行到 #include 指令位置的指令碼。語法是:
#include "filename.txt"
如果檔名中未提供完整的路徑,編譯將在包含#include 指令的同一目錄中查詢。檔名用“compiler:”作為字首的場合中,在編譯器目錄中查詢檔案。
四、段中引數
所有指令碼中的段,除[Setup]、[Messages]、[CustomMessages]、[LangOptions] 和 [Code] 段之外,包含的行中可有多個各自的引數。下列是[Files] 段中的一個舉例:
[Files]
Source: "MYPROG.EXE"; DestDir:"{app}"
Source: "MYPROG.CHM"; DestDir:"{app}"
Source: "README.TXT"; DestDir:"{app}"; Flags: isreadme
每個引數都由一個名字組成,然後跟隨一個冒號,然後是一個值。除非另外說明,如果引數未指定,將設定為一個預設值。一行中多個引數用分號隔開,並且可以以任何次序列出。
引數的值如果包含一個使用者定義的字串時,一般來說用雙引號(") 包含,例如象檔名。引號使用不是必需的,但這樣做可能會在值中的首位或末位被加入空格、分號和雙引號。
在要引用的值中使用一個雙引號字元,用兩個連續的雙引號字元,例如:
"This "" contains"" embedded "" quotes"
安裝程式編譯器會將它視作:
This " contains "embedded " quotes
如果你希望引數值是一個單個雙引號字元,用四個雙引號字元:""""。外面的兩個用於包含引用的字元;內部兩個寫入單個的雙引號字元。
五、常量
指令碼中的專案大部分可以嵌入常量。這些預定義的字元被包含在大括弧“ { }” 中。安裝程式或解除安裝程式會根據使用者選擇和系統配置將這些常量翻譯為文字值。例如,{win}在大部分系統中會被翻譯為“C:\WINDOWS”。
字元“{”視作為常量開始。如果你想將它作為實際字元使用,你必須使用兩個連續的“{”字元。(對於“}”則不需要。)
當在常量後面直接跟隨一個反斜槓時,如果常量的值末端已經包含了一個反斜槓號,安裝程式或解除安裝程式將自動刪除該反斜槓號。因此,如果一個特殊常量值是“C:\”,{constantname}\file 將翻譯為“C:\file”,而不是“C:\\file”。如果你想防止意外,將反斜框放入 { } 字元中,例如,{app}{\}。
下面是支援的常量列表。
目錄常量
{app}
使用者在安裝嚮導中的選擇目標位置頁中選定的應用程式目錄。
例如: 如果你在專案中指定了 {app}\MYPROG.EXE,使用者選擇了“C:\MYPROG”作為應用程式目錄,安裝程式將該檔案安裝到“C:\MYPROG\MYPROG.EXE”。
{win}
系統的 Windows 目錄。
例如: 如果你在專案中使用了 {win}\MYPROG.INI,且系統的 Windows 目錄是“C:\WINDOWS”,則安裝程式或解除安裝程式將它傳送到“C:\WINDOWS\MYPROG.INI”。
{sys}
系統的 Windows System 目錄 (在 NT 平臺上是 System32)。
例如: 如果你在專案中使用了 {sys}\CTL3D32.DLL,且系統的 WindowsSystem 目錄是“C:\WINDOWS\SYSTEM”,安裝程式或解除安裝程式將它傳送到“C:\WINDOWS\SYSTEM\CTL3D32.DLL”。
在 64 位Windows 中,按預設,the System32 path returned by this constant maps to the directorycontaining 32-bit system files, just like on 32-bit Windows. (This can beoverridden by enabling 64 位模式.)
{syswow64}
在 64 位 Windows 中,系統的 SysWOW64 目錄,一般是“C:\WINDOWS\SysWOW64”。這是在 32 位系統檔案駐留的真實目錄。在 32 位Windows 中,32 位系統檔案駐留在“System32”或“System”中,不是在單獨的的“ {syswow64}” 目錄,因此如果在這種情況下使用,這個常量將解析到與{sys} 相同的目錄。
Do not use this constant unless you have a specific need to obtain thename of the actual directory in which 32-bit system files reside. Gratuitouslyusing {syswow64} in places where {sys} will suffice may cause problems. (請查閱幫助文件 [Files] 段 sharedfile 標記示例。)
{src}
安裝程式檔案所在目錄。
例如: 你在專案中使用了 {src}\MYPROG.EXE,且使用者正在從“S:\”進行安裝,安裝程式將它傳送到“S:\MYPROG.EXE”。
{sd}
Windows 系統所在的驅動器。一般來說是“C:”。在 Windows NT 平臺,這個目錄常量等同於 SystemDrive 環境變數。
{pf}
程式資料夾位置。系統的 Program Files 目錄的路徑。{pf} 等於 {pf32},除非安裝程式運行於 64 位模式,在這種情況下它等於 {pf64}。
{pf32}
32 位程式資料夾。系統的 32 位程式檔案目錄路徑。一般來說它在 32 位 Windows 是“C:\Program Files”,在 64 位 Windows 中是“C:\Program Files (x86)”。
{pf64}
僅指 64 位 Windows: 64 位程式資料夾。系統的 64 位程式檔案目錄路徑,一般來說是“C:\Program Files”。如果嘗試在 32 位的 Windows 中展開這個常量,將會出現異常。
{cf}
公共檔案。系統公共檔案目錄路徑。{cf} 等於 {cf32},除非安裝程式運行於 64 位模式,在這種情況下它等於{cf64}。
{cf32}
32 位公共檔案。系統的 32 位公共檔案目錄路徑。一般來說它在 32 位 Windows 是“C:\Program Files\Common Files”,在 64 位 Windows 中是“C:\Program Files (x86)\CommonFiles”。
{cf64}
僅指 64 位 Windows: 64 位公共檔案。系統的 64 位公共檔案目錄路徑,一般來說是“C:\Program Files\Common Files”。如果嘗試在 32 位的 Windows 中展開這個常量,將會出現異常。
{tmp}
用於安裝程式或解除安裝程式的臨時目錄。這不是使用者的 TEMP 環境變數值。它是在安裝程式啟動後在使用者臨時目錄中建立的子目錄(象名為“C:\WINDOWS\TEMP\IS-xxxxx.tmp”)。目錄中的所有檔案和子目錄在安裝程式或解除安裝程式退出時刪除。在安裝時,這主要用於提取在[Run] 段執行、但安裝後不再需要的檔案。
{fonts}
字型目錄。通常是在 Windows 下面的名字“FONTS”的目錄。
{dao}
DAO 目錄,等同於 {cf}\Microsoft Shared\DAO。
{dotnet11}
32位 .NET Framework 版本 1.1 根目根。
如果所使用的系統上沒有 .NET Framework 版本 1.1,則顯示內部錯誤原因。
{dotnet20}
.NET Framework 版本 2.0 根目根。 {dotnet20} is equivalent to {dotnet2032} unless theinstall is running in 64位模式 , in which case it is equivalent to {dotnet2064} .
如果所使用的系統上沒有 .NET Framework 版本 2.0,則顯示內部錯誤原因。
{dotnet2032}
32位 .NET Framework 版本 2.0 根目根。
如果所使用的系統上沒有 .NET Framework 版本 2.0,則顯示內部錯誤原因。
{dotnet2064}
僅64位Windows: 64位 .NET Framework 版本 2.0 根目根。
如果所使用的系統上沒有 .NET Framework 版本 2.0,則顯示內部錯誤原因。
外殼資料夾常量
Inno Setup 支援其它目錄常量設定,作為外殼資料夾常量引用。它們可以與其它目錄常量相同方法使用。
“common”常量引用到所有使用者配置檔案。
下面的“user”常量引用到當前登入的使用者配置檔案進行安裝。This user is often not the sameas the currently logged-in user, so use the "user" constants withcaution.
除非有另外的註釋,外殼資料夾常量工作於 Inno Setup 支援的所有 Windows 版本,包括 Windows 95和 NT 4.0。
* = 如果登入的使用者缺少管理員許可權,或作業系統是 Windwos 95/98/Me,“common”結構對映到“user”結構。
{group}
開始選單資料夾路徑,由使用者在安裝程式的選擇開始選單資料夾嚮導頁中選定。在 WindowsNT/2000/XP/2003,這個資料夾總是建立在所有使用者配置檔案下,除非非使用者安裝程式的使用者沒有管理員許可權,這種情況下它將建立在使用者配置檔案下。
{localappdata}
本地Application Data資料夾。
{sendto}
當前使用者的 Send To 資料夾路徑。(這裡不是指公共 Send To 資料夾。)
{userappdata} & {commonappdata}
Application Data資料夾路徑。
{userdesktop} & {commondesktop} *
桌面資料夾路徑。
{userdocs} & {commondocs}
我的文件 (My Documents) 資料夾路徑 (在 NT 4.0,私人資料夾)。
{userfavorites} & {commonfavorites} *
收藏夾資料夾路徑。這些常量設定必須 至少“4.1, 4” MinVersion 設定。只在 Windows 2000 和更高版本支援{commonfavorites};如果在先前的 Windows 版本中使用,它將翻譯為等同於 {userfavorites} 目錄。
{userprograms} & {commonprograms} *
開始選單中程式資料夾路徑。
{userstartmenu} & {commonstartmenu} *
開始選單頂層路徑。
{userstartup} & {commonstartup} *
開始選單啟動資料夾路徑。
{usertemplates} & {commontemplates} *
模板資料夾路徑。僅在 Windows 2000 和更高版本支援 {commontemplates},如果使用的是先前的Windows 版本,它將被翻譯為等同於 {usertemplates} 目錄。
其它常量
{\}
反斜槓字元。查閱本頁頂部的註釋獲取使用 {\} 和只使用一個 \ 字元之間的差異。
{% NAME | DefaultValue }
嵌入一個環境變數值。
NAME 用於指定要使用的環境變數的名字。
DefaultValue 確定如果指定的變數在使用者系統中不存在時置入的字串。
如果你想在常量內部包含一個逗號、豎條 (“|”),或括弧後半部(“}”),你必須通過“%-encoding.”先用一個“%”字元然後跟隨它的兩上數字的十六進位制程式碼替換,從而避開它。逗號是“%2c”,豎條是“%7c”括弧後半部是“%7d”。如果你想實際使用“%”,使用“%25”。
NAME 和 DefaultValue 可以包含常量。注意,你不需要將常量中的括弧替換成上面所說的字元;上面所說的括弧後半部只在使用於其它地方時需要替換。
示例:
{%COMSPEC}
{%PROMPT|$P$G}
{cmd}
系統標準命令直譯器的完整路徑名。在 Windows NT/2000/XP/2003,是 Windows\System32\cmd.exe。在Windows 95/98/Me,是 Windows\COMMAND.COM。注意當展開這個常量時 COMSPEC 環境變數不使用。
{computername}
正在執行安裝程式或解除安裝程式的電腦名 (等同於由 GetComputerName 函式返回的值)。
{drive: Path }
從指定的路徑中提取並返回驅動器卷標和冒號 (例如“C:”)在 UNC 路徑的場合中,它返回伺服器和共享名 (例如“\\SERVER\SHARE”)。
Path 指定路徑。
如果你想在常量內部包含一個逗號、豎條 (“|”),或括弧後半部(“}”),你必須通過“%-encoding.”先用一個“%”字元然後跟隨它的兩上數字的十六進位制程式碼替換,從而避開它。逗號是“%2c”,豎條是“%7c”括弧後半部是“%7d”。如果你想實際使用“%”,使用“%25”。
Path 可以包含常量。注意,你不需要將常量中的括弧替換成上面所說的字元;上面所說的括弧後半部只在使用於其它地方時需要替換。
示例:
{drive:{src}}
{drive:c:\path\file}
{drive:\\server\share\path\file}
{groupname}
使用者在安裝程式嚮導頁的選擇開始選單資料夾中選定的資料夾名。它不同於 {group},只有名字,不包含路徑。
{hwnd}
(特殊用途) 轉換為安裝程式的背景視窗控制代碼。
{wizardhwnd}
(特殊用途) 轉換為安裝程式的嚮導視窗控制代碼。如果嚮導視窗控制代碼在翻譯完成時不能用,這個控制代碼設定為“0”。
{ini: Filename , Section , Key | DefaultValue }
從 .INI 檔案插入一個值。
Filename 指定要讀取的 .INI 檔案的名字。
Section 指定讀取的段名。
Key 指定讀取的鍵名。
DefaultValue 確定如果指定的鍵不存在時要插入的字元。
如果你想在常量內部包含一個逗號、豎條 (“|”),或括弧後半部(“}”),你必須通過“%-encoding.”先用一個“%”字元然後跟隨它的兩上數字的十六進位制程式碼替換,從而避開它。逗號是“%2c”,豎條是“%7c”括弧後半部是“%7d”。如果你想實際使用“%”,使用“%25”。
Filename, Section, 和 Key 可以包含常量。注意,你不需要將常量中的括弧替換成上面所說的字元;上面所說的括弧後半部只在使用於其它地方時需要替換。
示例:
{ini:{win}\MyProg.ini,Settings,Path|{pf}\My Program}
{language}
選定語言的內部名字。查閱 [Languages] 段幫助文件獲取更多資訊。
{cm: MessageName }
{cm: MessageName , Arguments }
根據活動語言嵌入一個自定義訊息值。
MessageName 用於指定要讀取的自定義訊息名。查閱 [CustomMessages] 段幫助文件獲取更多資訊。
Arguments 可隨意在訊息值中指定逗號分隔的宣告列表。
如果你想在常量內部包含一個逗號,垂直條 (“|”),或括號 (“}”),你必須使用“%-encoding.”避開它,用“%”字元,後面跟隨它的兩位數十六進位制程式碼替換。逗號是“%2c”,垂直條是“%7c”,括號是“%7d”,如果你想包含一個實際的“%”字元,用“%25”。
每個 Arguments 中的宣告可以包含常量。注意,你不需要避開上面描述的常量中的括號,只有在別處使用這種括號時需要避開。
示例:
{cm:LaunchProgram,Inno Setup}
如果活動語言是簡體中文,上面的示例被翻譯為“執行 Inno Setup”。
{reg:HK xx \ SubkeyName , ValueName | DefaultValue }
插入一個登錄檔值。
HKxx 指定登錄檔根鍵;查閱 [Registry] 段幫助文件獲取可用根鍵列表。
SubkeyName 指定要讀取的子鍵名。
ValueName 指定要讀取的值名;如果你想讀取鍵的“預設”值,將 ValueName 留空。
DefaultValue 確定在指定的登錄檔值不存在,或不是一個字串型別的值 (REG_SZ 或 REG_EXPAND_SZ)時要插入的字元。
如果你想在常量內部包含一個逗號、豎條 (“|”),或括弧後半部(“}”),你必須通過“%-encoding.”先用一個“%”字元然後跟隨它的兩上數字的十六進位制程式碼替換,從而避開它。逗號是“%2c”,豎條是“%7c”括弧後半部是“%7d”。如果你想實際使用“%”,使用“%25”。
SubkeyName, ValueName, 和 DefaultValue 可以包含常量。注意,你不需要將常量中的括弧替換成上面所說的字元;上面所說的括弧後半部只在使用於其它地方時需要替換。
示例:
{reg:HKLM\Software\My Program,Path|{pf}\My Program}
{param: ParamName | DefaultValue }
插入一個命令列引數值。
ParamName 指定要讀取的命令列引數名。
DefaultValue 確定如果指定的命令列引數不存在,或它的值不能確定時要插入的字元。
如果你想在常量內部包含一個逗號、豎條 (“|”),或括弧後半部 (“}”),你必須通過“%-encoding.”先用一個“%”字元然後跟隨它的兩上數字的十六進位制程式碼替換,從而避開它。逗號是“%2c”,豎條是“%7c”括弧後半部是“%7d”。如果你想實際使用“%”,使用“%25”。
ParamName 和 DefaultValue 可以包含常量。注意,你不需要將常量中的括弧替換成上面所說的字元;上面所說的括弧後半部只在使用於其它地方時需要替換。
示例:
{param:Path|{pf}\My Program}
如果指定命令列 /Path="c:\My Program",上面的例子翻譯為 c:\My Program。
{srcexe}
安裝程式檔案的完整路徑名,例如“C:\SETUP.EXE”。
{uninstallexe}
由安裝程式提取的解除安裝程式的完整路徑名,例如“C:\Program Files\MyProgram\unins000.exe”。這個常量一般用於在[Icons] 段條目建立一個解除安裝圖示。它只在 Uninstallable 設為 yes (預設設定) 時有效。
{sysuserinfoname}
{sysuserinfoorg}
Windows 已許可的名字和組織,這個資訊從登錄檔中讀取。
{userinfoname}
{userinfoorg}
{userinfoserial}
使用者在使用者資訊嚮導頁 (可以通過 UserInfoPage 指令來啟用) 中分別輸入的名字,組織和序列號。一般來說,這些常量用於在[Registry] 或 [INI] 條目中儲存它們以後要使用的值。
{username}
正在執行安裝程式或解除安裝程式的使用者的名字 (也可以用 GetUserName 函式返回)。
{log}
日誌檔案的名稱,如果 logging 沒啟用則返回一個空字元。
建立指令碼
段內參數
一些常量
公共引數
安裝指令碼段
[Setup] 段
[Dirs] 段
[Files] 段
[Icons] 段
[INI] 段
[InstallDelete] 段
[Messages] 段
[Registry] 段
[Run] 段
[UninstallDelete] 段
[UninstallRun] 段
其它問題:
其它注意事項
在命令列執行編譯器
安裝命令列引數
文件約定
"Windows 95/NT 4+"
這是 Windows 95, 98, NT 4.0, 2000 以及更高版本的簡稱。
"Windows 98/NT 4+"
這是 Windows 98, NT 4.0, 2000 以及更高版本的簡稱。
"Windows NT"
無論何時提及 Windows NT,除非有其他說明,他總是包括 Windows 2000(亦即 NT 5.0)。
等寬字型
當你看見文件裡的等寬字型,說明他是指令碼檔案的引用。
建立安裝程式
安裝程式是以指令碼(script)的方式來建立的。(不要一看見“指令碼”這個術語就害怕,你只需要花上幾分鐘的時間就可以掌握它的要領!)
該指令碼檔案的副檔名是“.iss”(意思是 Inno Setup Script)。指令碼檔案控制了安裝程式的每一個外觀介面。它指定了哪些檔案要被複制及其位置,建立什麼應用程式圖示和為它們命名等等。
指令碼檔案通常可以用安裝編譯程式內建的編輯器來建立和編輯,完成以後寫入指令碼檔案,下一步也是最後一步是在安裝編譯器的選單裡選擇“編譯”(Compile)。建立完成以後該幹什麼呢?準備執行這個基於該指令碼的安裝程式吧!預設情況下,這個檔案被建立在指令碼檔案所在資料夾的“OUTPUT”子資料夾下。
要了解指令碼檔案是如何工作的,執行安裝編譯器,單擊“檔案\開啟”選擇一個位於 Inno Setup 資料夾的 Samples子資料夾下的示例指令碼檔案。(用這些示例檔案作為你自己的指令碼檔案的模板可能示非常有用處的。)
參見
建立指令碼
建立指令碼
一個 Inno Setup 指令碼是一個簡單的 ASCII 文字檔案。它的格式非常類似於 .INI 檔案,如果你有這方面的經驗你就會發現學習起來有多麼的容易。
就象下面的示例所顯示的,指令碼檔案包括“段”(sections)和“項”(entries)。段名的兩邊始終有一對中括號“[]”,在 [Setup] 段中的每一項包括一個關鍵字和他的值,關鍵字和值用等於號“=”連線在一起。下面的這個示例說明了指令碼檔案是如何被組織的:
[在這裡新增段名,例如 Setup]
這是一個關鍵字=這是一個值
這是其它的關鍵字=這是其它的值
[在這裡新增段名,例如 Files]
Source: "MYPROG.EXE"; DestDir:"{app}"
你也可以在你的指令碼檔案中加上註釋(這些註釋將會被安裝編譯器忽略),方法是在每一行註釋的行首加上一個分號“;”,例如:
; 這是一行註釋,我可以在這裡寫上提醒我的內容...
參見
段內參數
一些常量
[Setup] 段
[Dirs] 段
[Files] 段
[Icons] 段
[INI] 段
[InstallDelete] 段
[Messages] 段
[Registry] 段
[Run] 段
[UninstallDelete] 段
[UninstallRun] 段
段內參數
指令碼檔案中的所有的段,除了[Setup],都是以行位單位,每行分為若干個引數。下面是一個 [Files]段的示例:
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"
Source: "MYPROG.HLP"; DestDir: "{app}"
Source: "README.TXT"; DestDir: "{app}"; Flags:isreadme
每一個引數都有一個名稱,後面緊跟一個冒號,然後是它的值。除非有其它的說明,引數是可選的,如果引數沒有指定則取它們的預設值。如果一行內有多個引數則用分號將其分開(還可以加一個空格符),他們可以按任何順序排列出來。
引數的值多數情況下是用引號擴起來("),但使用引號也是可選的。然而如果這個引數的值裡面的前導符號或者字尾符號是空格的話就必須加上引號了。另外需要說明的是使用內嵌的分號和引號,要插入一個引號則使用兩個連續的引號來代替。例如,下面的示例:
"This "" contains "" embedded ""quotes"
""""
安裝程式編譯器將會視為:
This " contains " embedded " quotes
"
一些常量
多數的指令碼項都可以在它們的內部嵌入“常量(constants)”,它們總是被一對大括號({ })擴起來的。當安裝程式被啟動的時候,這些常量將被轉換成其真實的值,這依賴於使用者的選擇和系統配置,例如,{win}這個常量在絕大多數的系統當中將被轉換成“C:\WINDOWS”。
字元“{”被視為一個常量的起始標記,如果你想獲得的是它的真實字元,那麼你必須使用兩個連續的“{”字元。
如果一個常量的後面緊跟著一個反斜槓,而此時這個常量被轉換成其真實值的結尾也是一個反斜槓時,InnoSetup 會自動的刪除一個反斜槓,這樣處理的明顯的好處是如果這個常量指向了“C:\”,{常量名}\file 就會被正確的轉換成“C:\file”而不是“C:\\file”。然而如果你想要防止這種事情的發生,那麼就要將反斜槓用大括號括起來,象這樣:{app}{\}.
下面所列出的是目前已經被支援的常量。
目錄常量
{app}
應用程式目錄,這是使用者在安裝嚮導的選擇安裝目錄頁裡面所選擇的。
例如:如果你使用了 {app}\MYPROG.EXE 作為一項並且使用者選擇了“C:\MYPROG”作為應用程式的目錄,那麼安裝程式就會將它轉換成“C:\MYPROG\MYPROG.EXE”。
{win}
系統的 Windows 目錄。 例如:如果你使用了 {win}\MYPROG.INI 作為一項並且系統的Windows 目錄是“C:\WINDOWS”,那麼安裝程式就會將它轉換成“C:\WINDOWS\MYPROG.INI”。
{sys}
系統的 Windows 系統(System)目錄(在 Windows NT/2000 下是System32)。 例如:如果你使用了 {sys}\CTL3D32.DLL 作為一項並且系統的 Windows 系統目錄是“C:\WINDOWS\SYSTEM”,那麼安裝程式就會將它轉換成“C:\WINDOWS\SYSTEM\CTL3D32.DLL”。
{src}
這個資料夾指向安裝程式所在的位置。
例如:如果你使用了 {src}\MYPROG.EXE 作為一項並且使用者是從“S:\ ”安裝的,那麼安裝程式就會將它轉換成“S:\MYPROG.EXE”。
<