При деинсталляции предыдущего установщика перед установкой нового, как скрыть всплывающее окно сообщения из un.onInit с помощью NSIS - PullRequest
0 голосов
/ 28 февраля 2019

После того, как приложение установлено с помощью NSIS, Для удаления его из Панели управления пишите следующий скрипт

Function un.onInit
    MessageBox MB_YESNO|MB_ICONEXCLAMATION "Are you sure you want to uninstall EMR?" /SD IDYES IDYES NoAbort
    Abort 
    NoAbort:
    SetAutoClose true

FunctionEnd

, чтобы при удалении сначала отображалось всплывающее сообщение («Вы уверены, что хотитеудалить EMR? ") При нажатии кнопки" ОК "удаление завершается.

А также для удаления установленного программного обеспечения перед его повторной установкой пишется следующий скрипт.

Function RemovePrevVerFunction

ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\EMR"  "UninstallString" 

 ${If} $R0 != ""
 MessageBox MB_OKCANCEL "EMR is already installed. Do you want to remove the previous version?" IDOK uninst
 Abort
 uninst:
 ExecWait "$INSTDIR\uninstall.exe"
 Quit
FunctionEnd

В приведенном выше сценарии я не использовал ExecWait "$ INSTDIR \ uninstall.exe / S", потому что я хотел показать пользователю процесс удаления.

Но здесь, как скрыть сообщение "ЕстьВы уверены, что хотите удалить EMR?что выскакивает из un.onInit?

При удалении MSI мы используем "/ qb", чтобы скрыть сообщение.Например, есть ли способ скрыть сообщение, используя NSIS?

1 Ответ

0 голосов
/ 28 февраля 2019

A MessageBox может быть пропущено при использовании / S, но без него вы должны создать собственную логику обнаружения:

!include LogicLib.nsh
!include FileFunc.nsh

InstallDir "$ProgramFiles\Test"

Page Directory
Page InstFiles

Function GetAppFromCommand
Exch $1
Push $2
StrCpy $2 $1 1 0
StrCmp $2 '"' 0 done
Push $3
StrCpy $3 ""
loop:
    IntOp $3 $3 + 1
    StrCpy $2 $1 1 $3
    StrCmp $2 '' +2
    StrCmp $2 '"' 0 loop
    StrCpy $1 $1 $3
    StrCpy $1 $1 "" 1 ; Remove starting quote
Pop $3
done:
Pop $2
Exch $1
FunctionEnd
!macro GetAppFromCommand in out
Push "${in}"
Call GetAppFromCommand
Pop ${out}
!macroend

!macro UninstallPreviousNSIS UninstCommand CustomParameters
Push $0
Push $1
Push $2
Push '${CustomParameters}'
Push '${UninstCommand}'
Call GetAppFromCommand ; Remove quotes and parameters from UninstCommand 
Pop $0
Pop $1
GetFullPathName $2 "$0\.."
ExecWait '"$0" $1 _?=$2'
Delete "$0" ; Extra cleanup because we used _?=
RMDir "$2"
Pop $2
Pop $1
Pop $0
!macroend

Function .onInit
ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" "UninstallString"
${If} $R0 != ""
    MessageBox MB_YESNO|MB_ICONQUESTION "$(^Name) is already installed. Do you want to remove the previous version?" IDNO noUninstOld
    !insertmacro UninstallPreviousNSIS $R0 "/NoMsgBox"
    noUninstOld:
${EndIf}
FunctionEnd

Section
SetOutPath $InstDir
File "/oname=$InstDir\Dummy.txt" "${__FILE__}"
WriteUninstaller "$InstDir\Uninst.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" "UninstallString" '"$InstDir\Uninst.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" "DisplayName" "$(^Name)"
SectionEnd

Function un.onInit
${GetParameters} $0
ClearErrors
${GetOptions} "$0" "/NoMsgBox"  $1
${IfNotThen} ${Errors} ${|} Goto NoAbort ${|}
MessageBox MB_YESNO|MB_ICONEXCLAMATION "Are you sure you want to uninstall $(^Name)?" /SD IDYES IDYES NoAbort
Abort 
NoAbort:
FunctionEnd

Section Uninstall
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
Delete "$InstDir\Dummy.txt"
Delete "$InstDir\Uninst.exe"
RMDir "$InstDir"
SectionEnd
...