• Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程


    https://blog.csdn.net/qq_36190858/article/details/84892706

    需求

    最近用 Inno Setup 做一个exe,可是在安装之前要停止正在运行的相应进程或者在卸载之前要停止正在运行的相应进程,可是发现它自身的方法不能满足要求,最后经过度娘的耐心帮助下终于在网上找到了相应的资料,在这里总结一下,方便以后使用。
    具体代码

        如果只是在安装之前判断一个进程是否存在,需要要引入 psvince.dll ,放在Inno Setup的安装目录下,代码如下:

    [Files]

    安装前判断进程, psvince.dll 文件放在Inno Setup的安装目录下

    Source: compiler:psvince.dll; Flags: dontcopy noencryption 
    

     
    [Code]

    安装前判断是否有进程正在运行

    function IsModuleLoaded(modulename: String ): Boolean;
    external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
    
        function InitializeSetup(): Boolean;
        var
            value: string;
            IsAppRunning: boolean;
        
        begin
            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;
    

     
    安装、卸载前检测进程运行情况并关闭相应进程,代码如下:

    [Files]

    需要在Files下加上这句

    Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion; Attribs: hidden
    

     
    [Code]

    安装前判断是否有进程正在运行,istask.dll文件放到inno setup安装目录下

    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;
    var
      ResultStr: String;
      ResultCode: Integer;
    begin
      Result:= true;                                                                      
      if RunTask('{#MyAppExeName}', false) then
      begin
         if MsgBox('安装程序检测到 {#MyAppName} 正在运行!'#13''#13'单击“是”按钮关闭程序;'#13''#13'单击“否”按钮退出安装!', mbConfirmation, MB_YESNO) = IDYES then
           KillTask('{#MyAppExeName}');
           Result:= true;                                        
      end
      else Result:= true;
    end;
    

     
    卸载前判断进程是否在运行,istask.dll文件和打包的exe文件放在一起

    function RunTaskU(FileName: string; bFullpath: Boolean): Boolean;
      external 'RunTask@{app}ISTask.dll stdcall delayload uninstallonly';
    function KillTaskU(ExeFileName: string): Integer;
      external 'KillTask@{app}ISTask.dll stdcall delayload uninstallonly';
    
    function InitializeUninstall(): Boolean;
    begin
      Result:= true;
      if RunTaskU('{#MyAppExeName}', false) then
      begin
        if MsgBox('卸载程序检测到 {#MyAppName} 正在运行!'#13''#13'单击“是”按钮关闭程序;'#13''#13'单击“否”按钮退出卸载!', mbConfirmation, MB_YESNO) = IDYES then
          KillTaskU('{#MyAppExeName}');
          Result:= true;
      end
      else Result:= true;
      UnloadDll(ExpandConstant('{app}ISTask.dll'));
    end;
    




    补充

    如果用的是Unicode版本的 Inno Setup ,上面的代码不能起到检测进程、杀进程的功能。
    解决方法:
    将 string 换成 ansistring 就可以了
    Demo下载

    需要相关的代码和 istask.dll 的小伙伴们可以在此下载
    https://download.csdn.net/download/qq_36190858/10836877
    需要相关的代码和 psvince .dll 的小伙伴们可以在此下载
    https://download.csdn.net/download/qq_36190858/10853091
    Inno Setup 中文帮助文档
    https://download.csdn.net/download/qq_36190858/10836946
    ————————————————
    版权声明:本文为CSDN博主「Foryourfuture」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_36190858/article/details/84892706

  • 相关阅读:
    BZOJ4003:[JLOI2015]城池攻占——题解
    洛谷3388:【模板】割点(割顶)——题解
    洛谷3805:【模板】manacher算法——题解
    BZOJ3236:[AHOI2013]作业——题解
    SPOJ3267/DQUERY:D-query——题解
    自动化移动安全渗透测试框架:Mobile Security Framework
    爬取京东评论,且修改网址直接可复用哦(送代码)
    谈谈从事IT测试行业的我,对于买房买车有什么样的感受
    python调用adb命令进行手机操作
    python selenium 处理时间日期控件
  • 原文地址:https://www.cnblogs.com/xiang--liu/p/12327949.html
Copyright © 2020-2023  润新知