Inno Setup 系列之安裝、卸載前檢測進程運行狀況並關閉相應進程

需求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

相關文章
相關標籤/搜索