打包的时候遇到了这样的需求:假似用户都是傻瓜                  式操作,如果更新安装程序的时候,之前的老程序还在运行这个时候如果你去提示让用户吧老程序手动退掉也不现实。

所以当遇到这种情况的时候能不能在更新安装程序上下手,在更新的时候就默认吧老程序杀掉(如果老程序在运行)。

答案是明确的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: 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';

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

posted on 2018-05-15 11:30  瓦楞球  阅读(1184)  评论(0编辑  收藏  举报