打包的时候遇到了这样的需求:假似用户都是傻瓜                  式操作,如果更新安装程序的时候,之前的老程序还在运行这个时候如果你去提示让用户吧老程序手动退掉也不现实。

所以当遇到这种情况的时候能不能在更新安装程序上下手,在更新的时候就默认吧老程序杀掉(如果老程序在运行)。

答案是明确的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('安装程序检测到**正在运行!'#''#'点击 "是" 按钮将停止进程然后继续安装;'#''#'点击"否" 按钮将终止安装程序!', 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

最新文章

  1. 用php实现一个简单的链式操作
  2. 分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装
  3. 学习SQLite之路(四)
  4. Maven编译项目报错:某些类找不到符号
  5. python的变量作用域问题
  6. 【翻译二十】-java线程池
  7. Gocd持续部署利器
  8. 小白学数据分析----->ARPPU的误区
  9. HDU 2896 病毒侵袭
  10. JAVA类访问URL
  11. shell export
  12. 《java编程思想》--多线程基础--Runnable
  13. Apple-Watch开发
  14. 二cha树
  15. 1.各个浏览器内核?经常遇到的浏览器兼容性有哪些?解决办法?常用的hack技巧?
  16. 【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)
  17. elasticsearch介绍,安装,安装错误解决及相应插件安装
  18. Unix环境高级编程:fork, vfork, clone
  19. 如何在Windows环境下模拟丢包
  20. 【巷子】---webpack配置非CMD规范的模块

热门文章

  1. PAT 乙级 1047 编程团体赛(20) C++版
  2. Spring Boot 容器选择 Undertow 而不是 Tomcat
  3. 服务注册发现consul之三:服务发现比较:Consul vs Zookeeper vs Etcd vs Eureka
  4. [转][C#]HttpClient 代码示例
  5. 廖雪峰Java4反射与泛型-3范型-3编写泛型
  6. go语言学习--指针数组和数组指针
  7. [UE4]更新Flag坐标
  8. [UE4]RepNotify,更新通知
  9. PHP 7下安装Swoole和Yar、Yaf
  10. Aspose.Word 输出表格后空格字符丢失的解决方法