例子:安装程序与卸载程序互相检查互斥
优质
小牛编辑
125浏览
2023-12-01
引用CheckMutex.nsi的内容:
/************************ CheckMutex.nsi ************************/ ;NSIS 安装程序与卸载程序互相检查互斥的例子 ;编写:zhfi ;邮箱: ;主页:http://hi.baidu.com/zhfi1022/ #定义自己的互斥名称:# #注意安:装程序不能与卸载程序相同!# !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 .onInit InitPluginsDir Call CreateMutex FunctionEnd 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 ReCheck Quit ${ElseIf} $R2 != 0 MessageBox MB_RetryCancel|MB_ICONEXCLAMATION "卸载程序已经运行!" IdRetry ReCheck Quit ${Else} #创建安装互斥:# System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${MyMutex_Install}") i .R1 ?e' Pop $R0 StrCmp $R0 0 +2 Quit ${EndIf} FunctionEnd Section Install SetOutPath $EXEDIR WriteUninstaller "$EXEDIR\Uninstall.exe" SectionEnd ;-------------------------------- ;卸载程序部分 Function un.onInit InitPluginsDir Call un.CreateMutex FunctionEnd 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 ReCheck Quit ${ElseIf} $R2 != 0 MessageBox MB_RetryCancel|MB_ICONEXCLAMATION "卸载程序已经运行!" IdRetry ReCheck Quit ${Else} #创建卸载互斥:# System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${MyMutex_UnInstall}") i .R1 ?e' Pop $R0 StrCmp $R0 0 +2 Quit ${EndIf} FunctionEnd Section Uninstall SetOutPath $EXEDIR Delete "$EXEDIR\Uninstall.exe" SectionEnd #脚本结束!#