NSIS: Как удалить предыдущую версию перед установкой новой, если имя программы изменилось? - PullRequest
0 голосов
/ 08 сентября 2018

В имени моей программы, которое записывается в реестр, есть номер версии (например, это выглядит так: «Моя программа 3.1»). Мне нужно удалить старую установку при установке новых версий 3.2 или 3.3 (и т. Д.), Но я не знаю, как заставить программу установки найти предыдущую установку в реестре по номеру версии. Да, я узнал образец этой ссылки: 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_FULLNAME} уже имеет другой номер версии. Подскажите пожалуйста, как сделать так, чтобы запись в реестре искала только название программы "Моя программа" и не учитывала номер версии?

Важное дополнение!

В сообщении выше я забыл уточнить одну вещь: мой установщик сделан для плагина, который устанавливается в нескольких версиях 3ds Max. В результате запись в реестре выглядит так: для одной версии «Моя программа 3.1 для 3dsMax 2014» и для другой версии «Моя программа 3.1 для 3dsMax 2018». И после установки новой версии моей программы записи должны выглядеть так: «Моя программа 3.2 для 3dsMax 2014» и «Моя программа 3.2 для 3dsMax 2018». То есть должен изменяться только номер версии моей программы, а все остальное («Моя программа ...» и «... для 3dsMax (версия 3ds Max)» должны оставаться неизменными. Спасибо за понимание и заранее благодарим за помощь!

1 Ответ

0 голосов
/ 09 сентября 2018

Используйте 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
...