2016-03-15 128 views
1

在我.nsi文件我在un.onInit功能以下邏輯:NSIS卸載程序不運行un.onInit

Function un.onInit 

    MessageBox MB_YESNO "This will uninstall. Continue?" IDYES checkRunning 
    checkRunning: 
    FindProcDLL::FindProc "app.exe" 
    IntCmp $R0 1 0 notRunning 
    MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "${PRODUCT} is running, please close it so the installation can proceed." /SD IDCANCEL IDRETRY checkRunning 
    Abort 

    notRunning: 
    !insertmacro Init "uninstaller" 
FunctionEnd 

然而,在MessageBox(和正在運行的進程消息)從未顯示。所以我經歷了很多文檔,顯然運行靜默模式可以防止這種方法被調用,所以我在.nsi文件中添加了SilentInstall normalSilentUnInstall normal。但是,這也不起作用。

我試圖通過手動去UNINSTALL.EXE並通過運行檢查是否存在已安裝的版本,如果有是調用安裝程序調用卸載程序:

uninst: 
    ClearErrors 
    ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file 
    ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT}" "UninstallString" 
    StrCmp $R0 "" done 
    Abort 

然而,這兩個所調用的做不會觸發到「正常」模式。那麼如何讓我的un.onInit函數被調用?

編輯:

至於有人問整個文件,here it is。我只複製了相關部分,但如果需要更多內容,請隨時查看。請注意,整個文件已經很老了,我只是更新它。

+0

您可以在這裏發佈整個.nsi文件嗎?調用訂單有時會影響「本機」nsi方法。此外,「nsProcess.nsh」是我用來檢查正在運行的應用程序;我不是說這是這裏的問題,但我沒有看到'FindProcDLL'用於此之前...... – MoonKnight

+0

@Killercam檢查編輯 – Gooey

+0

我很好奇,如果行爲改變時使用'un.onGUIInit'而不是 – idleberg

回答

0

升級後的MUI2(現代用戶界面2.0),降級到NSIS 2.5和使用NsProcess插件,我得到它的工作。該函數現在被調用,我的檢查使用新的插件。 FindProcDLL插件在NSIS> 2.46上打破

+0

這並不能解釋爲什麼沒有消息框!你的版本號也令我困惑,沒有2.4.6。有2.46。非官方的fork有2.46.x的版本,但如果你想要那些功能,你應該使用NSIS 3。 – Anders