打包的时候遇到了这样的需求:假似用户都是傻瓜 式操作,如果更新安装程序的时候,之前的老程序还在运行这个时候如果你去提示让用户吧老程序手动退掉也不现实。
所以当遇到这种情况的时候能不能在更新安装程序上下手,在更新的时候就默认吧老程序杀掉(如果老程序在运行)。
答案是明确的inno setup 是可以这样的操作。
下面是转的文章,谢谢作者的分享。
==============================================================
最近用inno setup想做一个exe,可是在安装之前要停止正在运行的相应进程,可是发现它自身的方法不能满足要求,终于在网上找到了相应的资料,在这里总结一下,方便以后使用。
1:如果我只是单纯的想在安装之前判断一个进程是否存在,要引入psvince.dll这个dll,放在inno setup的安装目录下(与其他dll相同目录),代码如下:
[files]
; 安装前判断进程,dll文件放在inno的安装目录中
Source: compiler:psvince.dll; Flags: dontcopy noencryption//安装前判断是否有进程正在运行
functionIsModuleLoaded(modulename: String ): Boolean;
external'IsModuleLoaded@files:psvince.dll stdcall setuponly';functionInitializeSetup(): Boolean;
var
value:string;
IsAppRunning: boolean;
begin//check Diagnosis press
value := ExpandConstant('{cm:DiagnosisRunning}');
Result:= true;
IsAppRunning:= IsModuleLoaded('进程名:如mysql.exe');while IsAppRunning dobeginif MsgBox('**工具正在运行,请先关闭它!', mbConfirmation, MB_OKCANCEL) = IDOK thenIsAppRunning:= IsModuleLoaded('进程名:如mysql.exe')elsebegin
IsAppRunning:= false;
Result:= false;
end;
end;
end;
2:如果我想在安装前结束掉某个进程,就要引入IsTask.dll了,放在inno setup的安装目录下(与其他dll相同目录),代码如下:
[Files]
Source: D:FDiskmakeexefd*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't 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';functionInitializeSetup(): Boolean;
begin
Result:= true;if RunTask('进程名:如mysql.exe', false) thenbeginif MsgBox('安装程序检测到**正在运行!'#13''#13'点击 "是" 按钮将停止进程然后继续安装;'#13''#13'点击"否" 按钮将终止安装程序!', mbConfirmation, MB_YESNO) = IDYES thenbegin
KillTask('进程名:如mysql.exe');
KillTask('mysqld.exe');
Result:= true;
endelseResult:= false;
endelseResult:= true;
end;