卸载程序不删除注册表
问题描述:
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 64b它是注册表视图,但卸载程序不会删除注册表项。
如果我删除了对64位操作系统的检查,那么在Wow6432Node中注册表的创建和删除工作正常。
答
如果您未安装x64应用程序,则根本不应使用SetRegView/$ PROGRAMFILES64。
如果在安装过程中安装x64应用程序并调用SetRegView 64
,则还必须在卸载程序中调用SetRegView 64
。
使用Process Monitor调查其他注册表问题...
+1
找到此答案保存了我的下午... – 2012-08-31 20:51:30
答
的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
...如果你想知道“为什么要创建一个重复的功能?”,正确回答这个问题是here ...
你安装一个应用程序的x64? – Anders 2011-12-20 08:26:55
请格外小心。您在工作时会看到一个预览图,并且有一个工具栏可以帮助您处理大部分格式。我已经修复了它,但它仍然需要工作。 – 2011-12-20 08:30:12
我希望卸载程序不会删除注册表;-) – 2011-12-20 08:30:55