при установке программного обеспечения, если определенное условие ложно Как откатить процесс установки программного обеспечения с помощью NSIS? - PullRequest
0 голосов
/ 09 декабря 2018

Мое требование - при установке программного обеспечения с использованием установщика NSIS, оно должно вызвать функцию и проверить, подключен ли ИБП к компьютеру или нет.

Если ИБП подключен, он завершит процесс установки.

Если батарея ИБП не подключена, появится окно с сообщением «Пожалуйста, подключите ИБП и попробуйте еще раз, нажав« Отмена ».и кнопки «Повторить».Если нажать «Отмена», произойдет откат процесса установки.

Я смогу получить информацию, если ИБП подключен или не использует следующую строку кода:

 System::Call "$INSTDIR\drvutil.dll::IsUPSPresent() i.r0 ?e"

ТогдаЯ использую условие «Если» и проверяю, подключен ли ИБП или нет.

 ${If} $0 = 0

Если условие ложное, мне нужно отобразить окно с сообщением типа «Пожалуйста, подключите ИБП и попробуйте снова с помощью« Отмена »."и" Повторить "кнопки".Если я нажму «Cancle», он должен откатить процесс установки.И если я подключу ИБП (или условие «Истина»), то установка должна завершиться.

Пожалуйста, помогите мне, как реализовать эту логику.

Ниже приведен мой фрагмент кода:

; The stuff to install
Section "UPSTest (required)"

  SectionIn RO

  DetailPrint "Testing UPS"

  SetOutPath $INSTDIR

  ; Give the dll path
  File E:\TestNullSoft\ValidateUPS.exe
  File E:\TestNullSoft\drvutil.dll
  File E:\TestNullSoft\UpsControl.dll
  File E:\TestNullSoft\UpsDevice.dll
  File E:\TestNullSoft\pdcdll.dll

  System::Call 'KERNEL32::AddDllDirectory(w "$INSTDIR")' ; Tell Windows we trust all .DLLs in this directory

  System::Call "$INSTDIR\drvutil.dll::IsUPSPresent() i.r0 ?e"
  Pop $1
  MessageBox MB_OK "Return value = $0, lasterr = $1"
  ; In the below line If the return value is 0("false"), That means UPS is not connected to the computer
   ${If} $0 = 0
   ; Here I need to show the Messagebox like "Please connect the UPS and try again with "Cancel" and "Retry" buttons"
   ; If I click on "Cancle", It should Roll back the installation process.

  ; Write the installation path into the registry
  WriteRegStr HKLM SOFTWARE\NSIS_UPSTest "Install_Dir" "$INSTDIR"

  ; Write the uninstall keys for Windows
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UPSTest" "DisplayName" "NSIS UPSTest"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UPSTest" "UninstallString" '"$INSTDIR\uninstall.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UPSTest" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\UPSTest" "NoRepair" 1
  WriteUninstaller "uninstall.exe"

SectionEnd

Пожалуйста, укажите ваши данные по этому вопросу.

1 Ответ

0 голосов
/ 10 декабря 2018

Вместо того, чтобы пытаться откатить частичную установку, вы можете просто поместить .DLL во временный каталог и выполнить проверку непосредственно перед началом установки файлов:

!include LogicLib.nsh

Section
InitPluginsDir
SetOutPath $PluginsDir
File "something\mydll.dll"
SetOutPath $Temp ; Don't hold the lock on $PluginsDir
System::Call 'KERNEL32::AddDllDirectory(w "$PluginsDir")' 

retry:
System::Call '$PluginsDir\mydll.dll::IsUPSPresentDummyFunction(i 0 r0)i.r0?e' ; Fake a return FALSE system call for this example
Pop $1 ; LastError
${If} $0 = 0
    MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "Blah blah UPS blah blah error $1" IDRETRY retry
    Abort "UPS required!" ; You can replace this with Quit if you want
${EndIf}

SetOutPath $InstDir
WriteUninstaller "$InstDir\uninstall.exe"
File "something\myapp.exe"
...
SectionEnd

$ PluginsDir автоматически удаляется, когдаустановщик завершает работу.

...