【Inno Setup】Pascal 腳本 ---- 事件函數


轉載

事件函數

Inno Setup支持以下函數和過程。

 

1. 【安裝初始化】該函數在安裝程序初始化時調用,返回False 將中斷安裝,True則繼續安裝,測試代碼如下:

function InitializeSetup(): Boolean;
function InitializeSetup(): Boolean;
begin
    Result := MsgBox('安裝程序正在初始化,你確定要安裝嗎?', mbConfirmation, MB_YESNO) = idYes;
    if Result = False then
      MsgBox('你放棄了安裝,程序直接退出', mbInformation, MB_OK);
end;

 

2. 該過程在開始的時候改變向導或者向導頁,不要指望使用InitializeSetup函數實現改變向導頁的功能,因為InitializeSetup函數觸發時向導窗口並不存在。

procedure InitializeWizard();

 

3. 【安裝終止時】該過程在安裝終止時被調用,注意及時在用戶沒有安裝任何文件之前退出也會被調用。測試代碼如下:

procedure DeinitializeSetup();
procedure DeinitializeSetup();
begin
    msgbox('DeinitializeSetup is called',mbInformation, MB_OK);
end;

 

4. 該過程提供用戶完成預安裝和安裝之后的任務,更多的是提供了安裝過程中的狀態。參數CurStep=ssInstall是在程序實際安裝前(所有的路徑等都配置好之后准備寫入文件錢),CurStep=ssPostInstall是實際安裝完成后,而CurStep=ssDone是在一次成功的安裝完成后、安裝程序終止前(即點擊finish按鈕后執行)。測試代碼如下:

procedure CurStepChanged(CurStep: TSetupStep);
procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep=ssinstall then
        MsgBox('准備寫入文件了', mbInformation, MB_OK);
    if CurStep=ssPostinstall then
        MsgBox('文件復制完成', mbInformation, MB_OK);
    if CurStep=ssDone then
        MsgBox('軟件成功安裝', mbInformation, MB_OK);
end;                

三個步驟的截圖如下:

 

5. 當用戶單擊下一步按鈕時調用。如果返回True,向導將移到下一頁;如果返回False,它仍保留在當前頁。測試代碼如下:

function NextButtonClick(CurPageID: Integer): Boolean;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
    Result := MsgBox('到下一頁去嗎?', mbConfirmation, MB_YESNO) = idYes;
end;

 

6. 和前面的NextButtonClick函數相反,當用戶單擊返回按鈕時調用。如果返回True,向導將移到前;如果返回False,它仍保留在當前頁,測試代碼略。

function BackButtonClick(CurPageID: Integer): Boolean;

 

7. 當用戶單擊取消按鈕或單擊窗口中的關閉按鈕時調用。Cancel參數指定取消進程是否該發生;默認為True。Confirm參數指定是否顯示“退出安裝程序嗎?”的消息框;默認為True。如果Cancel設為False,那么Confirm的值將被忽略。測試代碼如下:

 

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);

 

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
    cancel:=False;
end;

和你所預料的一樣,本段代碼將會導致Cancel按鈕失效,即逼迫用戶完成安裝或者采用非正常方式終止安裝程序。

 

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
    Confirm:=false;
end;

 

而上面的這段代碼將會在用戶點擊Cancel按鈕之后直接退出,不需要做進一步的確認。

 

 

 

8. 向導調用這個事件函數確定是否在所有頁或不在一個特殊頁 (用PageID指定) 顯示。如果返回True,將跳過該頁;如果你返回False,該頁被顯示。注意:這個事件函數不被wpWelcome、wpPreparing和wpInstalling 頁調用,還有安裝程序已經確定要跳過的頁也不會調用 (例如,沒有包含組件安裝程序的wpSelectComponents)。測試代碼如下:

function ShouldSkipPage(PageID: Integer): Boolean;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    if PageID=wpSelectDir then
        Result:=True;
end;    

本段代碼將會使得安裝程序跳過選擇安裝目錄的頁面,即如下頁面是不會被顯示的:

可用的PageID有: wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpInfoAfter, wpFinished

 

9. 在新向導頁 (由CurPageID 指定)顯示后調用。測試代碼如下:

procedure CurPageChanged(CurPageID: Integer);
procedure CurPageChanged(CurPageID: Integer);
begin
    Msgbox('ha,new page!',mbInformation, MB_OK);
end;

該段代碼將會導致每出現一個新的一面的時候就會彈出一個消息框。

 

10. 如果安裝程序在Pascal 腳本中發現該函數,它自動顯示密碼頁並調用CheckPassword檢查密碼。返回True 表示接受密碼,返回False拒絕。測試代碼如下:

function CheckPassword(Password: String): Boolean;
function CheckPassword(Password: String): Boolean;
begin
    if Password='castor' then
        result:=true;
end;    

在安裝過程中將會出現詢問安裝密碼的頁面,如果輸入錯誤將會出現下面的對話框:

為了避免在 [Code] 段內部貯存真實的密碼,最好使用其他的信息進行比較,例如使用GetMD5OfString(Password)計算實際密碼的MD5值保護實際密碼。

 

11. 如果返回True,安裝程序在安裝結束時提示用戶重啟系統False則不提示。測試代碼如下:

function NeedRestart(): Boolean;
function NeedRestart(): Boolean;
begin
    result:=True;
end;

在安裝完成之后的finish頁面,將會出現如下的選項:

 

12. 如果腳本中存在該函數,則在Ready to Install頁面變為活動頁的時候自動調用該函數,該函數返回一段文本,該文本顯示於Ready to Install頁面中的設置備注中,並且該文本將用NewLine參數分割為一個單獨的多行字符串,參數Space指代空格,測試是六個,其它參數將包含安裝程序用於設置段的字符(可能是空的)。例如MemoDirInfo參數包含選擇目錄段的字符串。測試代碼如下:

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoComponentsInfo, MemoTasksInfo: String): String;

var
res: String;

begin

    res:='UpdateReadyMemo Function is here'+NewLine+'This is the Second Line';
    res:=res+Space+'And with Six Spaces';
    res:=res+NewLine+'MemoUserInfoInfo'+MemoUserInfoInfo;
    res:=res+NewLine+'MemoDirInfo'+MemoDirInfo;
    res:=res+NewLine+'MemoTypeInfo'+MemoTypeInfo;
    res:=res+NewLine+'MemoComponentsInfo'+MemoComponentsInfo;
    res:=res+NewLine+'MemoComponentsInfo'+MemoComponentsInfo;
    res:=res+NewLine+'MemoTasksInfo'+MemoTasksInfo;

    Result:=res;

end;

運行后在安裝前會出現確認頁面:

標記黃色文字下面是各個參數的內容。

 

13. 本過程實現在自定義向導頁中貯存用戶輸入的設置,在腳本中放入本函數,並調用SetPreviousData(PreviousDataKey, ...)替換它,每次設置一個。

procedure RegisterPreviousData(PreviousDataKey: Integer);

 

14. 該函數將在用戶信息向導頁中自動出現一個序列號對象 (前提是[Setup]段中使用UserInfoPage=yes)。返回True表示接受序列號,返回False 拒絕。注意:當使用序列號時,該軟件並沒有被加密,而且Inno Setup源代碼是免費獲取的,有經驗的人從安裝程序中刪除序列號保護並不是很困難的事。本函數只是方便用戶在你的應用程序中仔細檢查輸入的序列號 (貯存在{userinfoserial}常量)。測試代碼如下:

function CheckSerial(Serial: String): Boolean;
function CheckSerial(Serial: String): Boolean;
begin
    if Serial='ABCDEF-1234567890' then
        Result:=True;
end;    

在安裝過程中將會出現一個頁面,如下:

如果Serial Number不正確,Next按鈕將會無效,只有正確的序列號才能使得Next按鈕有效,再次說明:不要指望使用這種方法保護你的軟件。

 

15. 返回一個非零值,命令安裝程序返回一個自定義退出代碼,本函數只在安裝程序運行完成並且退出代碼已是零時才調用。常見的退出代碼如下:

function GetCustomSetupExitCode: Integer;

代碼

說明

0

安裝程序成功完成

1

安裝程序初始化失敗

2

用戶在實際安裝前點擊取消,或者在開始的“這將安裝……”時選擇否

3

當准備到下一個安裝階段的時候發生致命錯誤,只有在比較極端的情況下發生這種錯誤,例如內存耗盡。

4

實際安裝過程中發生致命錯誤

5

用戶在實際安裝過程中點擊取消或者在“終止-重試-忽略”對話框中點擊了終止

6

安裝程序被調試器強制終止

7

准備安裝階段發現安裝無法進行

8

准備安裝階段發現安裝無法進行,並且系統需要重啟來解決問題

例如在用Inno Setup調試編譯后的安裝文件時,按下Ctrl+F2后,下面的調試輸出將會提示如下:

退出代碼為6,可見安裝程序被調試器強制終止。

 

16. 在與安裝階段返回一個非空字符串命令安裝程序停止,該字符串將會作為錯誤消息,設置NeedsRestartTrue將要求用戶重啟系統,該函數只在安裝程序發現不能繼續下去的時候才被調用。

function PrepareToInstall(var NeedsRestart: Boolean): String;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM