1. 程式人生 > >inno setup 安裝前判斷進程是否存在,以及停止相應進程<轉>

inno setup 安裝前判斷進程是否存在,以及停止相應進程<轉>

mat copy ger eve runt don rec run TP

打包的時候遇到了這樣的需求:假似用戶都是傻瓜 式操作,如果更新安裝程序的時候,之前的老程序還在運行這個時候如果你去提示讓用戶吧老程序手動退掉也不現實。

所以當遇到這種情況的時候能不能在更新安裝程序上下手,在更新的時候就默認吧老程序殺掉(如果老程序在運行)。

答案是明確的inno setup 是可以這樣的操作。

下面是轉的文章,謝謝作者的分享。

==============================================================

最近用inno setup想做一個exe,可是在安裝之前要停止正在運行的相應進程,可是發現它自身的方法不能滿足要求,終於在網上找到了相應的資料,在這裏總結一下,方便以後使用。

1:如果我只是單純的想在安裝之前判斷一個進程是否存在,要引入psvince.dll這個dll,放在inno setup的安裝目錄下(與其他dll相同目錄),代碼如下:

[files]

 ; 安裝前判斷進程,dll文件放在inno的安裝目錄中
 Source: compiler:psvince.dll; Flags: dontcopy noencryption 

//安裝前判斷是否有進程正在運行
function IsModuleLoaded(modulename: String ): Boolean;
external IsModuleLoaded@files:psvince.dll stdcall setuponly
; function InitializeSetup(): Boolean; var value: string; IsAppRunning: boolean; begin //check Diagnosis press 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;

2:如果我想在安裝前結束掉某個進程,就要引入IsTask.dll了,放在inno setup的安裝目錄下(與其他dll相同目錄),代碼如下:

[Files]
Source: D:\FDisk\makeexe\fd\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Dont use "Flags: ignoreversion" on any shared system files
; 安裝前判斷進程,dll文件放在inno的安裝目錄中
Source: compiler:IsTask.dll; Flags: dontcopy noencryption

[Code]
//安裝前判斷是否有進程正在運行,istask.dll文件與打包的exe文件一起
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;
begin
  Result:= true;
  if RunTask(進程名:如mysql.exe, false) then
      begin
           if MsgBox(安裝程序檢測到**正在運行!#13‘‘#13點擊 "是" 按鈕將停止進程然後繼續安裝;#13‘‘#13點擊"否" 按鈕將終止安裝程序!, mbConfirmation, MB_YESNO) = IDYES then
              begin
              KillTask(進程名:如mysql.exe);
              KillTask(mysqld.exe);
              Result:= true;
              end
           else
              Result:= false;
      end
  else
  Result:= true;
end;

原文地址:https://blog.csdn.net/u011592169/article/details/11073065

inno setup 安裝前判斷進程是否存在,以及停止相應進程<轉>