zoukankan      html  css  js  c++  java
  • NSIS 安装脚本常用功能整理

    仅允许一个安装实例运行

    !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
  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/njabsky/p/13913731.html
Copyright © 2011-2022 走看看