• 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

  • 相关阅读:
    Linux性能调优
    Linux动态库搜索路径的技巧
    [转]Linux动态库的种种要点
    [转]谈谈Linux下动态库查找路径的问题
    性能测试的几种业务模型设计
    性能测试解惑之并发压力
    一个系统的最大并发用户数为1100,怎么能推算出该系统的支持最大用户数
    IP欺骗
    关于Cocos2d-x随机数的生成
    关于Cocos2d-x节点和精灵节点的坐标、位置以及大小的设置
  • 原文地址:https://www.cnblogs.com/wainiwann/p/9040114.html
Copyright © 2020-2023  润新知