You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSIS教程:如何仅当DLL文件版本符合要求时安装应用?

NSIS安装程序:仅当指定DLL版本匹配时执行安装

以下是实现该需求的完整NSIS脚本,包含版本获取、对比逻辑及异常处理:

; 定义预先指定的目标DLL版本,格式为 主版本.次版本.构建号.修订号
!define TARGET_DLL_VERSION "1.2.3.4"

Section "MainSection" SEC01
    ; 检查指定路径下的MyDLL.dll是否存在
    IfFileExists "$INSTDIR\MyDLL.dll" +2 DLLNotFound
    
    ; 获取DLL版本信息,$R0存储主版本和次版本,$R1存储构建号和修订号
    GetDllVersion "$INSTDIR\MyDLL.dll" $R0 $R1
    
    ; 拆分版本号各部分:
    IntOp $R2 $R0 / 0x00010000 ; 提取主版本号
    IntOp $R3 $R0 & 0x0000FFFF ; 提取次版本号
    IntOp $R4 $R1 / 0x00010000 ; 提取构建号
    IntOp $R5 $R1 & 0x0000FFFF ; 提取修订号
    
    ; 拼接成标准版本字符串(如1.2.3.4)
    StrCpy $0 "$R2.$R3.$R4.$R5"
    
    ; 对比当前DLL版本与目标版本
    StrCmp $0 "${TARGET_DLL_VERSION}" VersionMatch VersionMismatch
    
VersionMatch:
    ; 版本匹配,执行后续安装操作
    MessageBox MB_OK "DLL版本匹配,开始安装..."
    ; 这里添加你的安装逻辑(如复制文件、创建快捷方式等)
    Goto EndCheck
    
VersionMismatch:
    MessageBox MB_OK|MB_ICONERROR "DLL版本不匹配!当前版本:$0,要求版本:${TARGET_DLL_VERSION}"
    Abort ; 终止安装
    
DLLNotFound:
    MessageBox MB_OK|MB_ICONERROR "未找到指定路径下的MyDLL.dll文件!"
    Abort ; 终止安装
    
EndCheck:
SectionEnd

关键部分说明:

  • 版本定义:通过!define指令预先设定需要匹配的DLL版本,修改为你的目标版本即可。
  • DLL存在性检查:先用IfFileExists确认文件存在,避免后续获取版本时出错。
  • 版本拆分逻辑:GetDllVersion返回的$R0和$R1是32位整数,通过位运算拆分出主版本、次版本、构建号、修订号,再拼接为易读的版本字符串。
  • 版本对比:使用StrCmp指令直接对比版本字符串,匹配则执行安装,不匹配或文件不存在时终止安装并给出提示。

内容的提问来源于stack exchange,提问作者Boramae

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:52:09