zoukankan      html  css  js  c++  java
  • Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程

    需求

    最近用 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

  • 相关阅读:
    16.10.16学到的JAVA知识
    参数类型转换求和(JAVA)
    大道至简第一篇读后感之愚公移山(伪代码)
    First
    18.10.22 luoguP3374 【模板】树状数组 1
    18.10.16 luoguP3372 线段树模板-区间更新值&求和(POJ3468 A Simple Problem with Integers)
    18.10.16 POJ 2528 Mayor's posters(线段树+离散化)
    18.10.15 POJ 2182 Lost Cows(线段树)
    18.10.10 数算作业-字符串
    18.10.9 不好做的最长上升子序列(nlogn树状数组解LIS)
  • 原文地址:https://www.cnblogs.com/yidaixiaohui/p/10124705.html
Copyright © 2011-2022 走看看