仅允许一个安装实例运行
!define PRODUCT_NAME "你的产品名称" ; …… # 检查是否已启动安装程序,同时只能运行一个安装程序 Function CheckMutexInstance System::Call 'kernel32::CreateMutexA(i0, i0, t"${PRODUCT_NAME}.exe")?e' Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION "安装程序已经在运行。" Abort FunctionEnd Function .onInit # …… Call CheckMutexInstance # …… FunctionEnd
在初始化的函数里调用了CheckMutexInstance函数,该函数会调用系统api创建实例,可根据此返回值判断控制仅允许运行一个实例。
限制同一台机器仅能安装一个产品,不允许安装多个
通过在安装的时候写入注册表,然后在安装的初始化函数中读取该注册表项,如果读取到该项,则说明已经安装过,给出提示即可。
!define PRODUCT_NAME "你的产品名称" !define PRODUCT_DIR_REGKEY "SoftwareMicrosoftWindowsCurrentVersionApp Paths${PRODUCT_NAME}.exe" # 注册表操作 Section -Post ; …… WriteRegDword HKLM "${PRODUCT_DIR_REGKEY}" "Installed" 1 ; …… SectionEnd #检查是否已经安装了该程序,只能安装一个 Function CheckOnlyOneInstalled ReadRegDWORD $0 HKLM '${PRODUCT_DIR_REGKEY}' "Installed" IntCmp $0 +1 +4 MessageBox MB_OK|MB_USERICON '$(^Name) 已安装在计算机中。如需重新安装,请先卸载已有的安装。' Quit nop FunctionEnd Function .onInit ; …… Call CheckOnlyOneInstalled ; …… FunctionEnd
卸载前弹出确认卸载对话框,确认后再卸载
nsis提供了卸载的初始化函数,直接在这个函数中给出提示,当用户点击取消是退出即可。
Function un.onInit MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2 Abort FunctionEnd
获取当前安装包所在路径,使用系统变量 $EXEDIR
比如我想在这个路径下创建一个Output文件夹,使用下面这条命令即可:
Section
CreateDirectory $EXEDIROutput
SectionEnd