卸载程序不删除注册表

use*_*234 3 registry nsis uninstall

Function Check32or64BitWindows
${If} ${RunningX64}
      strcpy $INSTDIR "$PROGRAMFILES64\${APP_FULL_PATH}" 
      SetRegView 64

${Else}
       SetRegView 32
       strcpy $INSTDIR "$PROGRAMFILES32\${APP_FULL_PATH}"
${EndIf}
FunctionEnd
Run Code Online (Sandbox Code Playgroud)

如果检测到旧版本,则执行

ExecWait '"$INSTDIR\uninst.exe" /S' $0
Run Code Online (Sandbox Code Playgroud)

我的卸载部分:

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
Run Code Online (Sandbox Code Playgroud)

Section -Post
WriteRegStr ${APP_UNINST_ROOT_KEY} "${APP_UNINST_KEY}" "DisplayName" "${APP_FULL_NAME}"
SectionEnd
Run Code Online (Sandbox Code Playgroud)

Post部分在Windows 64位注册表视图中创建注册表项,但卸载程序不会删除注册表项.

如果我删除了对64位操作系统的检查,那么在Wow6432Node中创建和删除注册表就可以正常工作.

And*_*ers 6

如果您不安装x64应用程序,则根本不应使用SetRegView/$ PROGRAMFILES64.

如果要安装x64应用程序并且SetRegView 64在安装期间调用SetRegView 64,则还必须调用卸载程序.

使用Process Monitor调查其他注册表问题......


tre*_*esf 5

我发现 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
Run Code Online (Sandbox Code Playgroud)

...如果您想知道“为什么创建重复的函数?”,该问题的正确答案就在这里...