Inno Setup 系列之安裝、卸載前檢測進程運行情況並關閉相應進程 ...
需求
最近用 Inno Setup 做一個exe,可是在安裝之前要停止正在運行的相應進程或者在卸載之前要停止正在運行的相應進程,可是發現它自身的方法不能滿足要求,最後經過度娘的耐心幫助下終於在網上找到了相應的資料,在這裡總結一下,方便以後使用。
具體代碼
如果只是在安裝之前判斷一個進程是否存在,需要要引入 psvince.dll ,放在Inno Setup的安裝目錄下,代碼如下:
[Files]
; 安裝前判斷進程, psvince.dll 文件放在Inno Setup的安裝目錄下
Source: compiler:psvince.dll; Flags: dontcopy noencryption
[Code]
;安裝前判斷是否有進程正在運行
function IsModuleLoaded(modulename: String ): Boolean; external 'IsModuleLoaded@files:psvince.dll stdcall setuponly'; function InitializeSetup(): Boolean; var value: string; IsAppRunning: boolean; begin value := ExpandConstant('{cm:DiagnosisRunning}'); Result:= true; IsAppRunning:= IsModuleLoaded('進程名:如mysql.exe'); while IsAppRunning do begin if MsgBox('**進程正在運行,請先關閉它!', mbConfirmation, MB_OKCANCEL) = IDOK then IsAppRunning:= IsModuleLoaded('進程名:如mysql.exe') else begin IsAppRunning:= false; Result:= false; end; end; end;
安裝、卸載前檢測進程運行情況並關閉相應進程,代碼如下:
[Files]
;需要在Files下加上這句
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion; Attribs: hidden
[Code]
;安裝前判斷是否有進程正在運行,istask.dll文件放到inno setup安裝目錄下
function RunTask(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@files:ISTask.dll stdcall delayload'; function KillTask(ExeFileName: string): Integer; external 'KillTask@files:ISTask.dll stdcall delayload'; function InitializeSetup(): Boolean; var ResultStr: String; ResultCode: Integer; begin Result:= true; if RunTask('{#MyAppExeName}', false) then begin if MsgBox('安裝程式檢測到 {#MyAppName} 正在運行!'#13''#13'單擊“是”按鈕關閉程式;'#13''#13'單擊“否”按鈕退出安裝!', mbConfirmation, MB_YESNO) = IDYES then KillTask('{#MyAppExeName}'); Result:= true; end else Result:= true; end;
;卸載前判斷進程是否在運行,istask.dll文件和打包的exe文件放在一起
function RunTaskU(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly'; function KillTaskU(ExeFileName: string): Integer; external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly'; function InitializeUninstall(): Boolean; begin Result:= true; if RunTaskU('{#MyAppExeName}', false) then begin if MsgBox('卸載程式檢測到 {#MyAppName} 正在運行!'#13''#13'單擊“是”按鈕關閉程式;'#13''#13'單擊“否”按鈕退出卸載!', mbConfirmation, MB_YESNO) = IDYES then KillTaskU('{#MyAppExeName}'); Result:= true; end else Result:= true; UnloadDll(ExpandConstant('{app}\ISTask.dll')); end;
補充
如果用的是Unicode版本的 Inno Setup ,上面的代碼不能起到檢測進程、殺進程的功能。
解決方法:
將 string 換成 ansistring 就可以了
Demo下載
需要相關的代碼和 istask.dll 的小伙伴們可以在此下載
https://download.csdn.net/download/qq_36190858/10836877
需要相關的代碼和 psvince .dll 的小伙伴們可以在此下載
https://download.csdn.net/download/qq_36190858/10853091
Inno Setup 中文幫助文檔
https://download.csdn.net/download/qq_36190858/10836946