Inno Setup安裝程序單例運行
阿新 • • 發佈:2017-05-26
() 發現 避免 創建 pre 已運行 procedure str tex
1、緣起:
KV項目下載底層升級包,老是報出升級文件占用問題,反復分析,不得其所。
今天突然發現同時啟動多個升級程序實例,分析認為安裝包同時被調用多次,導致實例訪問文件沖突,導致此問題。
安裝程序由Inno Setup制作,遂找其解決方案,最先想到的是互斥體,就由此開始!
2、AppMutex
[Setup]
AppMutex=MyAppMutex
安裝程序Setup段,此互斥變量,會在安裝程序啟動時檢測是否有此互斥體的程序在運行,若有則提示:
通常,在程序中置同名互斥體,此入判斷,可避免程序在運行時,安裝包再去安裝,比如產品升級。
好,可在安裝程序中創建一互斥體,以其做為判斷條件。
3、CreateMutex()
Inno Setup中,此函數是創建互斥體的,我們在安裝程序運行後創建互斥體,這樣再次運行安裝程序,就可互斥了。
[Code]
procedure InitializeWizard();
begin
//開始運行,創建此互斥體
CreateMutex(‘MyAppMutex‘);
end;
註意此互斥體創建不能置於function InitializeSetup(): Boolean;函數, 它先於[Setup]段運行,會導致安裝程序不能執行。
4、CheckForMutexes()
因為升級程序是靜默安裝的,以上代碼雖可執行,但會彈出節2那個提示框,不夠友好。
即使加靜默安裝參數/SP- /VERYSILENT也無濟於事,它仍然不能避免此彈出框,怎麽辦?這麽辦:
function InitializeSetup(): Boolean; begin //若此例已運行,則不再執行 Result := not CheckForMutexes(‘MyAppMutex‘); end;
此函數中判斷互斥體,若已存在,直接退出,安靜的很!
問題解決了!
大體來說,正常安裝程序,需要彈提示框的,前三步都能解決問題,正常交互亦當如此。
而用互斥量處理多例,比FindWindowByWindowName()方法可靠的多,這個好用。
Inno Setup安裝程序單例運行