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
  • 相关阅读:
    Android学习小Demo(20)关于Fragment的应用
    计算机常识--框架、编程语言篇
    用python做oj上的简单题(持续更新中.......)
    UIControl-IOS开发
    Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 具体解释
    包管理器Bower使用手冊之中的一个
    23web app实现上下左右滑动
    iOS IAP教程
    一步一步写算法(之 A*算法)
    执行游戏时出现0xc000007b错误的解决方法
  • 原文地址:https://www.cnblogs.com/njabsky/p/13913731.html
Copyright © 2011-2022 走看看