деинсталлятор не удаляет реестр - PullRequest
3 голосов
/ 20 декабря 2011
Function Check32or64BitWindows
${If} ${RunningX64}
      strcpy $INSTDIR "$PROGRAMFILES64\${APP_FULL_PATH}" 
      SetRegView 64

${Else}
       SetRegView 32
       strcpy $INSTDIR "$PROGRAMFILES32\${APP_FULL_PATH}"
${EndIf}
FunctionEnd

Если обнаружена более старая версия, я выполняю

ExecWait '"$INSTDIR\uninst.exe" /S' $0

Мой раздел удаления:

Section uninstall
!define APP_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_VENDOR} ${APP_NAME}"
!define APP_UNINST_ROOT_KEY "HKLM"
DeleteRegKey ${APP_UNINST_ROOT_KEY} "${APP_UNINST_KEY}"
SectionEnd

Section -Post
WriteRegStr ${APP_UNINST_ROOT_KEY} "${APP_UNINST_KEY}" "DisplayName" "${APP_FULL_NAME}"
SectionEnd

Раздел сообщения создаетЗапись реестра в представлении реестра Windows 64bit, но программа удаления не удаляет запись реестра.

Если я удаляю проверку для 64-разрядной ОС, тогда создание и удаление реестра в Wow6432Node работает правильно.

Ответы [ 2 ]

6 голосов
/ 20 декабря 2011

Если вы не устанавливаете приложение x64, вам вообще не следует использовать SetRegView / $ PROGRAMFILES64.

Если вы устанавливаете приложение x64, и во время установки вы вызывали SetRegView 64, вам также нужно вызвать SetRegView 64 в программе удаления.

Используйте Process Monitor для исследования других проблем реестра ...

1 голос
/ 28 мая 2015

Обучающие программы NSIS, которые я нашел, помещают 64-битную логику установщика в функцию .onInit, которая вызывается автоматически при запуске установки.

Логически, можно попытаться вызвать ее вручную при удалениираздел через Call .onInit, но компиляция NSIS не удастся, потому что имя функции не начинается с un..

Так что, логически, если вы создаете un.onInit, он должен "Просто работать".И это так.

Function un.onInit
${If} ${RunningX64}
    ; Comment out this next line in production environment
    MessageBox MB_OK "This is a 64-bit os, applying work-arounds"
    SetRegView 64
    StrCpy $INSTDIR "$PROGRAMFILES64\My FooBar Application"
${EndIf}
FunctionEnd

... и если вам интересно "Зачем создавать дублирующую функцию?", Правильный ответ на этот вопрос будет здесь ...

...