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} 正在运行!'#''#'单击“是”按钮关闭程序;'#''#'单击“否”按钮退出安装!', 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} 正在运行!'#''#'单击“是”按钮关闭程序;'#''#'单击“否”按钮退出卸载!', 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
Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程的更多相关文章
- Inno Setup 系列之先卸载之后再安装
需求使用Inno Setup打包程序之后,很多时候我们需要在安装文件之前卸载原有的程序而不是覆盖安装,本文的Code就是实现了这样的功能.如果想要在安装前先卸载,那么需要加下面代码,需要注意的是双星号 ...
- Inno Setup 系列之安装、卸载时调用bat
需求 想在安装的时候调用install.bat,在卸载的时候调用uninstall.bat 解决 可以这样写 Inno Setup 的脚本: [Setup] ; NOTE: The value of ...
- Inno Setup命令行安装卸载参数
安装命令行参数安装程序接受可选的命令行参数.这些对于系统管理员以及其它程序调用安装程序时有用./SP- 在安装开始时禁用“这将安装... 你想继续吗?”的提示,当然,如果 [Setup] 段的指令 D ...
- Inno Setup 安装、卸载前检测进程或服务
[转载]Inno Setup 安装.卸载前检测进程或服务 (2015-04-24 17:37:20) 转载▼ 标签: 转载 原文地址:Inno Setup 安装.卸载前检测进程或服务作者:一去丶二 ...
- inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效
inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效 inno setup 安装卸载时检测程序是佛正在运行卸载完成后自动打开网页-代码无效 --------------------- ...
- 使用Inno Setup Compiler制作安装软件包
前言 项目开发完成之后,需要程序打包发行,本文使用Inno Setup工具制作安装软件包. 系统环境 系统:win7_x64 工具:Inno Setup Complier 实现步骤 1.下载安装Inn ...
- Inno Setup打包之先卸载再安装
使用Inno Setup打包程序之后,如果想要在安装前先卸载,那么需要加下面代码,需要注意的是红色标注的改为你们自己的.网上看到有些说_is1前面用AppName,但是我这边验证不行. [Setup] ...
- Inno setup中定制安装路径
我的程序修改了安装界面,所以我的界面中提供了更改安装路径的方法. 用户修改后的路径会被传回inno setup脚本,脚本中需要做的事情如下: 1,写一个函数,来返回新的安装路径,如: function ...
- Inno Setup添加中文安装语言文件
如果你不添加中文安装语言文件,你编译生成的安装包的语言是不会有中文. 一,打开软件安装目录下的Languages文件夹下,有如下好多文件,可是就是没有Chianese.isl. 好了,你只需要随便拷贝 ...
随机推荐
- 使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度
碰到问题:移动用户访问web服务器www.osyunwei.com很慢解决办法:1.在移动机房放置一台nginx反向代理服务器2.通过域名DNS智能解析,所有移动用户访问www.osyunwei.co ...
- java代码示例(5)
/** * 需求分析:从键盘输入5名学员某门课程的笔试成绩,并求出五门成绩的总成绩和平均成绩 * @author chenyanlong * 日期:2017/10/14 */ package com. ...
- CENTOS 升级Nodejs 到最新版本
1.去官网下载和自己系统匹配的文件: 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过 uname -a ...
- golang 的时间格式化操作
怎么做 简而言之 time.Now().Format("2006-01-02 15:04:05") 你将会获得如同 yyyy-MM-dd hh-mm-ss 这样的输出. 还可以 在 ...
- IoC之Ninject
一.Ninject安装 Ninject是一个轻量级的开源的DI容器,可以通过Nuget直接安装: 二.Ninject的简单使用 模型代码: //计算器接口 public interface ICalc ...
- bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋
https://www.lydsy.com/JudgeOnline/problem.php?id=5248 先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小 棋盘的局面一定是阶梯状,且从 ...
- jQuery基础 (一)——样式篇(认识jQuery)
一.认识 //等待dom元素加载完毕. $(document).ready(function(){ alert("Hello World!"); }); 二.jQuery对象与DO ...
- This dependency was not found: * !!vue-style-loader!css-loader?
npm install stylus-loader css-loader style-loader --save-dev 猜测这两个组件发布时是不需要的,所以要加上-dev
- 17. Spring Boot 配置嵌入式Servlet容器
一.如何定制和修改Servlet容器的相关配置 1.配置文件(ServerProperties): 优先级最高 server.port=8081 server.context‐path=/crud s ...
- pyqt5 添加属性-类方法用属性形式访问
方法一 装饰器法 import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout,QLab ...