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

发布于 2023-02-23 | 作者: _城南花已开 | 来源: CSDN博客 | 转载于: 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:
Function End 

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

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:
; ------ 做其他操作
Function End 
  • 添加脚本 卸载时
    //不提示用户 直接关闭进程
  • ; ------ 卸载前检查程序是否正在运行
    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