zoukankan      html  css  js  c++  java
  • inno setup 安装前判断进程是否存在,以及停止相应进程<转>

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

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

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

  • 相关阅读:
    洛谷 P5057 [CQOI2006]简单题 题解
    洛谷 P3368 【模板】树状数组 2 题解
    洛谷 P3374 【模板】树状数组 1 题解
    洛谷 P2023 [AHOI2009]维护序列 题解
    洛谷 P2253 好一个一中腰鼓! 题解
    求最长不下降/上升/下降/不上升子序列
    [SQL Server]Index/deadlock
    Ubuntu 14.04下从源码安装qt4.x
    Ubuntu系统下Import cv2提示no modules ...错误
    Ubuntu 14.04下安装CUDA8.0
  • 原文地址:https://www.cnblogs.com/wainiwann/p/9040114.html
Copyright © 2011-2022 走看看