对于有过编程基础的人来说,防止程序重复同时运行是一件必做而又严谨的事情,NSIS打包安装程序也不例外,下面IT备忘录小编将给大家分享NSIS 程序互斥函数 检测防止程序重复同时运行。
代码分享:
/************************ CheckMutex.nsi************************/;NSIS 安装程序与卸载程序互相检查互斥的例子;编写:ITmemo.cn#定义自己的互斥名称:##注意安:装程序不能与卸载程序相同!#!define MyMutex_Install "MyMutex_Install"!define MyMutex_UnInstall "MyMutex_UnInstall" ;--------------------------------;Include Modern UI !include "MUI.nsh"!include "LogicLib.nsh" ;--------------------------------;General ;Name and file Name "Mutex Test" OutFile "Mutex.exe" ;--------------------------------#添加安装页面:# !insertmacro MUI_PAGE_Welcome !insertmacro MUI_PAGE_InstFiles !insertmacro MUI_PAGE_Finish#添加卸载页面:# !insertmacro MUI_UNPAGE_Welcome !insertmacro MUI_UNPAGE_InstFiles !insertmacro MUI_UNPAGE_Finish ;--------------------------------;加入语言文件 !insertmacro MUI_LANGUAGE "SimpChinese" ;--------------------------------;安装程序部分 Function .onInitInitPluginsDirCall CreateMutexFunctionEnd Function CreateMutex#检查安装互斥:#ReCheck: System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${MyMutex_Install}") i .R1 ?e'Pop $R0 System::Call 'kernel32::CloseHandle(i R1) i.s'#检查卸载互斥:# System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${MyMutex_UnInstall}") i .R3 ?e'Pop $R2 System::Call 'kernel32::CloseHandle(i R3) i.s'#判断安装/卸载互斥的存在#${If} $R0 != 0 MessageBox MB_RetryCancel|MB_ICONEXCLAMATION "安装程序已经运行!" IdRetry ReCheckQuit${ElseIf} $R2 != 0 MessageBox MB_RetryCancel|MB_ICONEXCLAMATION "卸载程序已经运行!" IdRetry ReCheckQuit${Else}#创建安装互斥:# System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${MyMutex_Install}") i .R1 ?e'Pop $R0 StrCmp $R0 0 +2Quit${EndIf}FunctionEnd Section Install SetOutPath $EXEDIR WriteUninstaller "$EXEDIR\Uninstall.exe"SectionEnd ;--------------------------------;卸载程序部分 Function un.onInitInitPluginsDirCall un.CreateMutexFunctionEnd Function Un.CreateMutex#检查安装互斥:#ReCheck: System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${MyMutex_Install}") i .R1 ?e'Pop $R0 System::Call 'kernel32::CloseHandle(i R1) i.s'#检查卸载互斥:#CheckUnInstall: System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${MyMutex_UnInstall}") i .R3 ?e'Pop $R2 System::Call 'kernel32::CloseHandle(i R3) i.s'#判断安装/卸载互斥的存在#${If} $R0 != 0 MessageBox MB_RetryCancel|MB_ICONEXCLAMATION "安装程序已经运行!" IdRetry ReCheckQuit${ElseIf} $R2 != 0 MessageBox MB_RetryCancel|MB_ICONEXCLAMATION "卸载程序已经运行!" IdRetry ReCheckQuit${Else}#创建卸载互斥:# System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${MyMutex_UnInstall}") i .R1 ?e'Pop $R0 StrCmp $R0 0 +2Quit${EndIf}FunctionEnd Section Uninstall SetOutPath $EXEDIR Delete "$EXEDIR\Uninstall.exe"SectionEnd #脚本结束!#