1. 程式人生 > >Inno Setup安裝程序單例運行

Inno Setup安裝程序單例運行

() 發現 避免 創建 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安裝程序單例運行