2011-12-20 145 views
3
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中注册表的创建和删除工作正常。

+0

你安装一个应用程序的x64? – Anders 2011-12-20 08:26:55

+0

请格外小心。您在工作时会看到一个预览图,并且有一个工具栏可以帮助您处理大部分格式。我已经修复了它,但它仍然需要工作。 – 2011-12-20 08:30:12

+0

我希望卸载程序不会删除注册表;-) – 2011-12-20 08:30:55

回答

6

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

如果在安装过程中安装x64应用程序并调用SetRegView 64,则还必须在卸载程序中调用SetRegView 64

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

+1

找到此答案保存了我的下午... – 2012-08-31 20:51:30

1

的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 ...

相关问题