需求mysql
最近用 Inno Setup 作一個exe,但是在安裝以前要中止正在運行的相應進程或者在卸載以前要中止正在運行的相應進程,但是發現它自身的方法不能知足要求,最後通過度孃的耐心幫助下終於在網上找到了相應的資料,在這裏總結一下,方便之後使用。sql
具體代碼app
若是隻是在安裝以前判斷一個進程是否存在,須要要引入 psvince.dll ,放在Inno Setup的安裝目錄下,代碼以下:spa
[Files].net
; 安裝前判斷進程, psvince.dll 文件放在Inno Setup的安裝目錄下code
Source: compiler:psvince.dll; Flags: dontcopy noencryption
[Code] blog
;安裝前判斷是否有進程正在運行進程
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]string
;須要在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