需求

最近用 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 系列之安装、卸载前检测进程运行情况并关闭相应进程的更多相关文章

  1. Inno Setup 系列之先卸载之后再安装

    需求使用Inno Setup打包程序之后,很多时候我们需要在安装文件之前卸载原有的程序而不是覆盖安装,本文的Code就是实现了这样的功能.如果想要在安装前先卸载,那么需要加下面代码,需要注意的是双星号 ...

  2. Inno Setup 系列之安装、卸载时调用bat

    需求 想在安装的时候调用install.bat,在卸载的时候调用uninstall.bat 解决 可以这样写 Inno Setup 的脚本: [Setup] ; NOTE: The value of ...

  3. Inno Setup命令行安装卸载参数

    安装命令行参数安装程序接受可选的命令行参数.这些对于系统管理员以及其它程序调用安装程序时有用./SP- 在安装开始时禁用“这将安装... 你想继续吗?”的提示,当然,如果 [Setup] 段的指令 D ...

  4. Inno Setup 安装、卸载前检测进程或服务

    [转载]Inno Setup 安装.卸载前检测进程或服务 (2015-04-24 17:37:20) 转载▼ 标签: 转载   原文地址:Inno Setup 安装.卸载前检测进程或服务作者:一去丶二 ...

  5. inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效

    inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效 inno setup 安装卸载时检测程序是佛正在运行卸载完成后自动打开网页-代码无效 --------------------- ...

  6. 使用Inno Setup Compiler制作安装软件包

    前言 项目开发完成之后,需要程序打包发行,本文使用Inno Setup工具制作安装软件包. 系统环境 系统:win7_x64 工具:Inno Setup Complier 实现步骤 1.下载安装Inn ...

  7. Inno Setup打包之先卸载再安装

    使用Inno Setup打包程序之后,如果想要在安装前先卸载,那么需要加下面代码,需要注意的是红色标注的改为你们自己的.网上看到有些说_is1前面用AppName,但是我这边验证不行. [Setup] ...

  8. Inno setup中定制安装路径

    我的程序修改了安装界面,所以我的界面中提供了更改安装路径的方法. 用户修改后的路径会被传回inno setup脚本,脚本中需要做的事情如下: 1,写一个函数,来返回新的安装路径,如: function ...

  9. Inno Setup添加中文安装语言文件

    如果你不添加中文安装语言文件,你编译生成的安装包的语言是不会有中文. 一,打开软件安装目录下的Languages文件夹下,有如下好多文件,可是就是没有Chianese.isl. 好了,你只需要随便拷贝 ...

随机推荐

  1. 洛谷 P1064 金明的预算方案(01背包问题)

    传送门:Problem 1064 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是 “01”背包问题的变形. 如果不考虑买附件必 ...

  2. 二叉查找树(BST)、平衡二叉树(AVL树)

    二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点,都满足其左子树上所有结点的数据域均小于或等于根结点的数据域,右 ...

  3. 2.如何导入Spring约束?

    前言:之前在学习约束的时候,关于导入约束一直迷茫,今天详细的截图一下,以下图为例 第一步: 新建 第二步: 第三步: 第四步: 第五步:(这里写的有点小错误,是第三个) 第六步: 然后点击OK 最后的 ...

  4. eclipse卸载自带maven

    1.在eclipse的安装目录下,找到   features和plugins文件夹,删除这两个文件夹下maven对应的jar和文件夹(windows用户建议用如下搜索:*maven*和*m2e*) 2 ...

  5. redis 启动停止脚本

    redis 启动停止脚本,该redis需要密码登录,如没有密码,去掉stop函数里的 -a #!/bin/sh # #chkconfig: 2345 80 90 # Simple Redis init ...

  6. Node remains in conflict,svn冲突解决办法

    修改问价svn 提交后其他客户端svn update更新时出现以下问题 Updating '.':Skipped 'Hi3559_Stream' -- Node remains in conflict ...

  7. Windows服务BAT命令-安装、卸载、启动、停止

    1.安装服务 %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe D:\WiseMES\MES.WindowsService ...

  8. Study 4 —— 数据类型(1)

    基本类型数字字符串布尔 数字 整数 int    在32位机器上,整数的位数为32位,取值范围为-2**31~2**30    在64位机器上,整数的位数为64位,取值范围为-2**63~2**62 ...

  9. 006、容器 What、Why、How(2018-12-21 周五)

    参考https://www.cnblogs.com/CloudMan6/p/6751516.html   What - 什么是容器?       容器是一种轻量级.可移植.自包含的软件打包技术,是应用 ...

  10. 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域