杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2178|回复: 0

Inno setup 安装前判断进程是否存在,以及停止相应进程

[复制链接]
发表于 2017-1-2 14:14:03 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
       最近用inno setup想做一个exe,可是在安装之前要停止正在运行的相应进程,可是发现它自身的方法不能满足要求,终于在网上找到了相应的资料,在这里总结一下,方便以后使用。

1:如果我只是单纯的想在安装之前判断一个进程是否存在,要引入psvince.dll这个dll,放在inno setup的安装目录下(与其他dll相同目录),代码如下:  

  1. [files]

  2. ; 安装前判断进程,dll文件放在inno的安装目录中
  3. Source: compiler:psvince.dll; Flags: dontcopy noencryption

  4. //安装前判断是否有进程正在运行
  5. function IsModuleLoaded(modulename: String ): Boolean;
  6. external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';

  7. function InitializeSetup(): Boolean;
  8. var
  9.     value: string;
  10.     IsAppRunning: boolean;

  11. begin
  12.     //check Diagnosis press
  13.     value := ExpandConstant('{cm:DiagnosisRunning}');      
  14.     Result:= true;
  15.     IsAppRunning:= IsModuleLoaded('进程名:如MySQL.exe');
  16.     while IsAppRunning do
  17.     begin
  18.         if MsgBox('**工具正在运行,请先关闭它!', mbConfirmation, MB_OKCANCEL) = IDOK then
  19.         IsAppRunning:= IsModuleLoaded('进程名:如mysql.exe')
  20.         else
  21.         begin
  22.             IsAppRunning:= false;
  23.             Result:= false;
  24.         end;
  25.     end;
  26. end;
复制代码


2:如果我想在安装前结束掉某个进程,就要引入IsTask.dll了,放在inno setup的安装目录下(与其他dll相同目录),代码如下:  
  1. [Files]
  2. Source: D:\FDisk\makeexe\fd\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
  3. ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
  4. ; 安装前判断进程,dll文件放在inno的安装目录中
  5. Source: compiler:IsTask.dll; Flags: dontcopy noencryption

  6. [Code]
  7. //安装前判断是否有进程正在运行,istask.dll文件与打包的exe文件一起
  8. function RunTask(FileName: string; bFullpath: Boolean): Boolean;
  9. external 'RunTask@files:ISTask.dll stdcall delayload';
  10. function KillTask(ExeFileName: string): Integer;
  11. external 'KillTask@files:ISTask.dll stdcall delayload';

  12. function InitializeSetup(): Boolean;
  13. begin
  14.   Result:= true;
  15.   if RunTask('进程名:如mysql.exe', false) then
  16.       begin
  17.            if MsgBox('安装程序检测到**正在运行!'#13''#13'点击 "是" 按钮将停止进程然后继续安装;'#13''#13'点击"否" 按钮将终止安装程序!', mbConfirmation, MB_YESNO) = IDYES then
  18.               begin
  19.               KillTask('进程名:如mysql.exe');
  20.               KillTask('mysqld.exe');
  21.               Result:= true;
  22.               end
  23.            else
  24.               Result:= false;
  25.       end
  26.   else
  27.   Result:= true;
  28. end;
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-19 17:12 , Processed in 0.101256 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表