代码之家  ›  专栏  ›  技术社区  ›  zvon

NSIS:如果程序名发生更改,如何在安装新版本之前卸载以前的版本?

  •  1
  • zvon  · 技术社区  · 7 年前

    http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_new 但在本例中,注册表搜索是按程序名执行的。在我的例子中,程序的名称会更改,因为版本号已经更改,安装程序在安装新版本之前无法再在注册表中找到卸载旧版本的条目。请告诉我,我该怎么做。

    这是我的示例代码:

    ;Define main variables:
    !define PRODUCT_NAME "My programm"
    !define PRODUCT_VERSION "3.9"
    !define PRODUCT_FULLNAME "${PRODUCT_NAME} ${PRODUCT_VERSION}"
    !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_FULLNAME}"
    !define PRODUCT_UNINST_ROOT_KEY "HKLM"
    !define PRODUCT_UNINSTALL_EXE "uninstall.exe"
    
    ;Registry is added by this:
    WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" '"$INSTDIR\${PRODUCT_UNINSTALL_EXE}" _?=$INSTDIR'
    
    ;Read the registry key value for uninstall previous installation:
    ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
    StrCmp $R0 "" done
    

    但是这个命令在注册表中找不到条目,因为程序${PRODUCT\u FULLNAME}的名称已经有了不同的版本号。 请告诉我如何使注册表中的条目只查找程序名“My program”,而不考虑版本号?

    重要的补充!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Anders    7 年前

    使用 EnumRegKey 要枚举卸载密钥:

    Section
    StrLen $3 "${PRODUCT_NAME}"
    StrCpy $0 0
    loop:
    EnumRegKey $1 ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall" $0
        StrCmp $1 "" done
        IntOp $0 $0 + 1
        StrCpy $2 $1 $3 ; Get ${PRODUCT_NAME} prefix
        StrCmp $2 "${PRODUCT_NAME}" 0 loop
        ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall\$1" UninstallString
        StrCmp $2 "" loop
        ExecWait $2 ; (This assumes you stored the old versions with the _?= parameter)
        Goto loop
    done:
    SectionEnd
    
    推荐文章