卸载程序未删除注册表

5
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

“Post”部分在Windows 64位注册表视图中创建了注册表项,但卸载程序未删除该注册表项。

如果我移除对64位操作系统的检查,则在Wow6432Node中创建和删除注册表项正常工作。


你正在安装一个x64应用程序吗? - Anders
请注意格式。您可以在工作时获得预览和工具栏,这些工具可以帮助您完成大部分格式设置。我已经修复了大部分问题,但仍需要进一步处理。 - Chris Morgan
我希望卸载程序不会删除注册表;-) - Chris Morgan
2个回答

9
如果您没有安装x64应用程序,就不应该使用SetRegView/$PROGRAMFILES64。
如果您正在安装x64应用程序,并且在安装过程中调用了SetRegView 64,则在卸载程序中也必须调用SetRegView 64
使用Process Monitor来调查其他注册表问题...

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

如果您在想“为什么要创建重复的函数?”,那么对于这个问题的正确答案请看这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接