2011-12-20 142 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 ...

相關問題