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

转载: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、付费专栏及课程。

余额充值