转载:/z5337/p/4766415.html
转载:/nsisbuildqqstop.html
转载:/s/blog_6aeaee7e0100smrn.html(如果当前程序正在运行,杀掉进程继续安装或者卸载,给了启发)
转载:/llmys/article/details/88618177(教程)
使用场景:
如果我们要安装或升级程序时,软件正在运行,这个时候安装文件肯定会替换失败,友好的操作是提示用户结束正在运行的程序
准备工作:
1.检测程序是否在运行,需要使用插件FindProcDLL.dll,杀死当前运行的进程,需要使用插件KillProcDLL.dll
2.这两个插件的下载地址:/FindProcDLL_plug-in
3 .放到C:\Program Files (x86)\NSIS\Plugins里面
4. 添加脚本 安装时
//不提示用户 直接关闭进程
; ------ 安装前检查程序是否正在运行Function .onInitKill_Module:FindProcDLL::FindProc ${MAIN_MODULE_NAME}Pop $R0IntCmp $R0 1 0 no_runKillProcDLL::KillProc ${MAIN_MODULE_NAME}Sleep 1000FindProcDLL::FindProc ${MAIN_MODULE_NAME}Pop $R0IntCmp $R0 1 0 no_runGoto Kill_Module //这里递归可以清除多个同名进程no_run:FunctionEnd
//提示用户 用户点击关闭
Function .onInit; ------ 安装前检查程序是否正在运行StrCpy $IsPop "no"Kill_Module:FindProcDLL::FindProc ${MAIN_MODULE_NAME}Pop $R0IntCmp $R0 1 0 no_runIfSilent 0 +3KillProcDLL::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 500Pop $R0${If} $R0 != 0KillProcDLL::KillProc "$EXEFILE"${EndIf}goon:KillProcDLL::KillProc ${MAIN_MODULE_NAME}StrCpy $IsPop "yes"Goto Kill_Moduleno_run:; ------ 做其他操作FunctionEnd
添加脚本 卸载时
//不提示用户 直接关闭进程
; ------ 卸载前检查程序是否正在运行Function un.onInitKill_Module:FindProcDLL::FindProc ${MAIN_MODULE_NAME}Pop $R0IntCmp $R0 1 0 no_runKillProcDLL::KillProc ${MAIN_MODULE_NAME}Sleep 1000FindProcDLL::FindProc ${MAIN_MODULE_NAME}Pop $R0IntCmp $R0 1 0 no_runGoto Kill_Module //这里递归可以清除多个同名进程no_run:FunctionEnd
//提示用户 用户点击关闭
Function un.onInit; ------ 安装前检查程序是否正在运行StrCpy $IsPop "no"Kill_Module:FindProcDLL::FindProc ${MAIN_MODULE_NAME}Pop $R0IntCmp $R0 1 0 no_runIfSilent 0 +3KillProcDLL::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 500Pop $R0${If} $R0 != 0KillProcDLL::KillProc "$EXEFILE"${EndIf}goon:KillProcDLL::KillProc ${MAIN_MODULE_NAME}StrCpy $IsPop "yes"Goto Kill_Moduleno_run:; ------ 做其他操作FunctionEnd