Избегайте дублирования кода функции в NSIS - PullRequest
3 голосов
/ 28 ноября 2011

В настоящее время у меня есть следующий код сценариев.

Section "Uninstall"
...
...
Call un.DeleteDirIfEmpty 
SectionEnd


Function GetJRE
    ; Call must not be used with functions starting with "un." in the non-uninstall sections.
    Call
FunctionEnd


Function un.DeleteDirIfEmpty
...
...
FunctionEnd

Function DeleteDirIfEmpty
...
...
FunctionEnd

Обратите внимание, что мне нужно предоставить 2 версии DeleteDirIfEmpty, чтобы одну и ту же операцию можно было выполнить в разделе неинсталляции и разделе деинсталляции.

Их код один и тот же, только имена разные.un.DeleteDirIfEmpty и DeleteDirIfEmpty

Как можно иметь только 1 функцию, но может вызываться любым разделом?

Ответы [ 2 ]

5 голосов
/ 28 ноября 2011

Взгляните на \ Include \ Util.nsh, он используется для превращения макроса в функцию:

!include Util.nsh

!macro MyFunction
MessageBox mb_ok "Hello World"
!macroend
!define MyFunction "${CallArtificialFunction} MyFunction"

Section
${MyFunction}
SectionEnd

Примечание. Чтобы удалить пустой каталог, просто используйте RMDir (без /переключатель r)

0 голосов
/ 26 июля 2012

Эта ссылка также помогла мне понять.В нем приведен пример, показывающий, как разделить функциональность между установщиком и удалителем.Скажем, у вас есть функция, которой нужно делиться, которая называется myfunc, затем вы создаете макрос, который также вызывает ее из деинсталлятора.Цитирование по ссылке:

; Name of our installer.
Name "Function Sharing Example"
OutFile "FunctionShareExample.exe"
InstallDir "$PROGRAMFILES\Function Sharing Example\"

; We need some pages.
Page directory
Page instfiles
; And uninstaller pages.
UninstPage uninstconfirm
UninstPage instfiles

; Show the details.
ShowInstDetails show
ShowUninstDetails show

; ******************* The shared function. *******************
!macro MYMACRO un
  Function ${un}myfunc
    MessageBox MB_OK "This is the function ${un}myfunc."
    DetailPrint "Very ${un}funny text."
    DetailPrint "More ${un}funny text."
  FunctionEnd
!macroend

; Insert function as an installer and uninstaller function.
!insertmacro MYMACRO ""
!insertmacro MYMACRO "un."

Section "Install"
  ; ******************* Call the installer function. *******************
  Call myfunc

  SetOutPath "$INSTDIR"
  ; Write an uninstaller.
  WriteUninstaller "$INSTDIR\uninstall.exe"
  ShowWindow $HWNDPARENT 6
  ; Show the install directory, so you can run the uninstaller straight away.
  ExecShell open "$INSTDIR"
  Sleep 1000
  ShowWindow $HWNDPARENT 9
SectionEnd

Section "Uninstall"
  ; ******************* Call the un.installer function. *******************
  Call un.myfunc

  ; Clean up install directory (delete it).
  Delete "$INSTDIR\uninstall.exe"
  RMDir "$INSTDIR"
SectionEnd
...