NSIS安装或卸载时检查程序是否正在运行

该博客介绍了如何在使用NSIS安装脚本时,检查并关闭正在运行的程序进程,确保安装或卸载的顺利进行。通过引入FindProcDLL.dll和KillProcDLL.dll插件,实现查找并终止相关进程的功能。在安装和卸载前后分别添加相应脚本,以无提示或提示用户的方式结束程序,确保安装过程的完整性。
摘要由CSDN通过智能技术生成

转载:https://www.cnblogs.com/z5337/p/4766415.html

转载:https://www.gongzi.org/nsisbuildqqstop.html

转载:http://blog.sina.com.cn/s/blog_6aeaee7e0100smrn.html(如果当前程序正在运行,杀掉进程继续安装或者卸载,给了启发)

转载:https://blog.csdn.net/llmys/article/details/88618177(教程)

使用场景:

如果我们要安装或升级程序时,软件正在运行,这个时候安装文件肯定会替换失败,友好的操作是提示用户结束正在运行的程序

准备工作:

1.检测程序是否在运行,需要使用插件FindProcDLL.dll,杀死当前运行的进程,需要使用插件KillProcDLL.dll

2.这两个插件的下载地址:http://nsis.sourceforge.net/FindProcDLL_plug-in

3 .放到C:\Program Files (x86)\NSIS\Plugins里面
在这里插入图片描述
4. 添加脚本 安装时

//不提示用户 直接关闭进程

; ------ 安装前检查程序是否正在运行
Function .onInit
Kill_Module:
FindProcDLL::FindProc ${MAIN_MODULE_NAME}
   Pop $R0
   IntCmp $R0 1 0 no_run
   KillProcDLL::KillProc ${MAIN_MODULE_NAME}
   Sleep 1000
   FindProcDLL::FindProc ${MAIN_MODULE_NAME}
   Pop $R0
   IntCmp $R0 1 0 no_run
   Goto Kill_Module  //这里递归可以清除多个同名进程
   no_run:
FunctionEnd

//提示用户 用户点击关闭

Function .onInit
; ------ 安装前检查程序是否正在运行
StrCpy $IsPop "no"
Kill_Module:
  FindProcDLL::FindProc ${MAIN_MODULE_NAME}
   Pop $R0

  IntCmp $R0 1 0  no_run
	IfSilent 0 +3
	KillProcDLL::KillProc  ${MAIN_MODULE_NAME}
	Goto no_run
	${if} $IsPop == 'no'
  MessageBox MB_YESNO|MB_ICONSTOP "${MAIN_MODULE_NAME}正在运行,是否退出?" IDYES goon IDNO exit
  ${else}
		Goto goon
	${Endif}
  exit:
	 	MyWndShadow::FreeShadow /NOUNLOAD $WarningForm ;SendMessage $HWNDPARENT "0x2" "" "" ; 给窗口加个销毁消息我这里简化
    KillProcDLL::KillProc "$EXEFILE"
    FindProcDLL::FindProc "$EXEFILE"
    Sleep 500
    Pop $R0
    ${If} $R0 != 0
    KillProcDLL::KillProc "$EXEFILE"
    ${EndIf}
  goon:
	 KillProcDLL::KillProc  ${MAIN_MODULE_NAME}
	 StrCpy $IsPop "yes"
	 Goto Kill_Module
no_run:
; ------ 做其他操作
FunctionEnd
  1. 添加脚本 卸载时
    //不提示用户 直接关闭进程
; ------ 卸载前检查程序是否正在运行
Function un.onInit
Kill_Module:
FindProcDLL::FindProc ${MAIN_MODULE_NAME}
   Pop $R0
   IntCmp $R0 1 0 no_run
   KillProcDLL::KillProc ${MAIN_MODULE_NAME}
   Sleep 1000
   FindProcDLL::FindProc ${MAIN_MODULE_NAME}
   Pop $R0
   IntCmp $R0 1 0 no_run
   Goto Kill_Module  //这里递归可以清除多个同名进程
   no_run:
FunctionEnd

//提示用户 用户点击关闭

Function un.onInit
; ------ 安装前检查程序是否正在运行
StrCpy $IsPop "no"
Kill_Module:
  FindProcDLL::FindProc ${MAIN_MODULE_NAME}
   Pop $R0

  IntCmp $R0 1 0  no_run
	IfSilent 0 +3
	KillProcDLL::KillProc  ${MAIN_MODULE_NAME}
	Goto no_run
	${if} $IsPop == 'no'
  MessageBox MB_YESNO|MB_ICONSTOP "${MAIN_MODULE_NAME}正在运行,是否退出?" IDYES goon IDNO exit
  ${else}
		Goto goon
	${Endif}
  exit:
	 	MyWndShadow::FreeShadow /NOUNLOAD $WarningForm ;SendMessage $HWNDPARENT "0x2" "" "" ; 给窗口加个销毁消息我这里简化
    KillProcDLL::KillProc "$EXEFILE"
    FindProcDLL::FindProc "$EXEFILE"
    Sleep 500
    Pop $R0
    ${If} $R0 != 0
    KillProcDLL::KillProc "$EXEFILE"
    ${EndIf}
  goon:
	 KillProcDLL::KillProc  ${MAIN_MODULE_NAME}
	 StrCpy $IsPop "yes"
	 Goto Kill_Module
no_run:
; ------ 做其他操作
FunctionEnd
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值