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;

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Inno Setup可以使用Pascal脚本语言中的`CheckForMutexes`函数来检查指定的互斥对象是否已经被创建,从而判断某个进程是否正在运行。 下面是一个示例代码: ```pascal [Code] function CheckForMutexes(Mutexes: array of String): Boolean; var I: Integer; MutexHandle: THandle; begin Result := False; for I := 0 to High(Mutexes) do begin MutexHandle := CreateMutex(nil, True, PChar(Mutexes[I])); if MutexHandle <> 0 then begin if GetLastError = ERROR_ALREADY_EXISTS then begin Result := True; CloseHandle(MutexHandle); Exit; end; end; end; end; ``` 在上面的代码中,`CheckForMutexes`函数接收一个字符串数组`Mutexes`作为参数,每个字符串代表一个互斥对象。函数会逐个创建互斥对象,如果创建成功且错误码为`ERROR_ALREADY_EXISTS`,则说明该互斥对象已经存在,即某个进程正在使用该互斥对象,函数返回`True`。 在安装程序中,可以在`InitializeSetup`函数中调用`CheckForMutexes`函数来检查某个进程是否正在运行,如果返回`True`则说明该进程正在运行,安装程序可以选择终止安装或者提示用户关闭该进程后再继续安装。例如: ```pascal function InitializeSetup(): Boolean; begin if CheckForMutexes(['MyAppMutex']) then begin MsgBox('MyApp is already running. Please close it before installing.', mbError, MB_OK); Result := False; Exit; end; Result := True; end; ``` 在上面的代码中,如果`CheckForMutexes(['MyAppMutex'])`返回`True`,则会弹出一个错误提示框,提示用户关闭`MyApp`后再继续安装。如果返回`False`,则安装程序可以继续执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值