NSIS Tutorial Teil 3

Einleitung

Im zweiten Teil des Tutorials erweiterten wir unseren Installer um einen Uninstaller und warfen einen Blick auf einige weitere Wizard-Seiten und die Auswahl der zu installierenden Teile. Das Ziel des dritten Teils ist es nun, dem Installer ein etwas aktuelleres Erscheinungsbild zu geben.

Ein modernerer Look

Um dem Installer ein etwas moderneres Aussehen zu geben gibt es das Modern User Interface. Um unseren Installer (basierend auf „secondinstaller“) aufzuwerten benötigt es nicht viel:

!include "MUI.nsh"

Name "Fifth Installer"

OutFile "fifthinstaller.exe"
InstallDir $PROGRAMFILES\MyFifthInstaller

!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

Section ""
  SetOutPath $INSTDIR
  File C:\Windows\system32\notepad.exe
  WriteUninstaller $INSTDIR\uninstall.exe
SectionEnd

Section "Uninstall"
  Delete $INSTDIR\uninstall.exe
  Delete $INSTDIR\notepad.exe
  RMDir $INSTDIR
SectionEnd

Drei Änderungen haben wir angebracht:

!include "MUI.nsh"

Fügt die Datei MUI.nsh ein als wäre sie Teil unseres Scripts. In der Datei MUI.nsh sind die benötigten Makros definiert.

!insertmacro ...

Als Ersatz für die Page bzw. UninstPage Kommandos werden die benötigten Seiten mit den Makros eingefügt.

!insertmacro MUI_LANGUAGE "English"

Mit diesem Makro werden die Englischen Texte eingefügt. Für deutsche Texte ist entsprechend „German“ als Sprache anzugeben.

Fourth Installer reloaded

Die im Teil 2 hinzugefügten Dialoge möchten wir nun natürlich auch mit dem Modern User Interface umsetzen.

And here we go:

!include "MUI.nsh"

Name "Sixth Installer"
!define INSTALLATIONNAME "MySixthInstaller"
OutFile "sixthinstaller.exe"
InstallDir $PROGRAMFILES\${INSTALLATIONNAME}

Page custom getUsername
!insertmacro MUI_PAGE_LICENSE "license.txt"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

LangString PAGE_NAMECOMPANY_TITLE ${LANG_ENGLISH} "Custom Page Sample"
LangString PAGE_NAMECOMPANY_SUBTITLE ${LANG_ENGLISH} "Please enter Name and Company."

Var UserName
Var Company

Function ".onInit"
  InitPluginsDir
  File /oname=$PLUGINSDIR\namecompany.ini "namecompany.ini"
FunctionEnd

Function getUsername
  !insertmacro MUI_HEADER_TEXT $(PAGE_NAMECOMPANY_TITLE) $(PAGE_NAMECOMPANY_SUBTITLE)
  Push $R0
  InstallOptions::dialog $PLUGINSDIR\namecompany.ini
  Pop $R0
  ReadINIStr $UserName "$PLUGINSDIR\namecompany.ini" "Field 2" "state"
  ReadINIStr $Company "$PLUGINSDIR\namecompany.ini" "Field 4" "state"
  MessageBox MB_OK "$UserName$\r$\n$Company"
  Pop $R0
FunctionEnd

Section ""
  SetOutPath $INSTDIR
  File C:\Windows\system32\notepad.exe
  WriteUninstaller $INSTDIR\uninstall.exe
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "DisplayName" "Forth Installer"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "UninstallString" '"$INSTDIR\uninstall.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoRepair" 1

SectionEnd

Section "Sample Text File"
  File "license.txt"
SectionEnd

Section /o "Another Sample Text File"
  File "license2.txt"
SectionEnd

Section "Start Menu Shortcuts"
  CreateDirectory "$SMPROGRAMS\${INSTALLATIONNAME}"
  CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\notepad.lnk" "$INSTDIR\notepad.exe" "" "$INSTDIR\notepad.exe" 0
SectionEnd

Section "Uninstall"
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}"
  Delete $INSTDIR\uninstall.exe
  Delete $INSTDIR\notepad.exe
  Delete  $INSTDIR\license.txt
  Delete  $INSTDIR\license2.txt
  RMDir $INSTDIR
  Delete "$SMPROGRAMS\${INSTALLATIONNAME}\*.*"
  RMDir "$SMPROGRAMS\${INSTALLATIONNAME}"
SectionEnd

Die wichtigsten Änderungen gegenüber dem „Fourth Installer“:

Die !include-Anweisung, das !insertmacro MUI_LANGUAGE-Kommando und die !insertmacro MUI_PAGE_ ...-Kommandos haben wir bereits oben gesehen.

Die Sections wurden eins-zu-eins aus dem Fourth Installer übernommen. Auch die Function[/cc]s wurden übernommen, mit einer kleinen aber wichtigen Änderung:

[cci lang="nsis"]!insertmacro MUI_HEADER_TEXT $(PAGE_NAMECOMPANY_TITLE) $(PAGE_NAMECOMPANY_SUBTITLE)

Mit dieser Zeile wird die Titelzeile für die Custom Page definiert. Diese benötigt, wie aus dem Script ersichtlich, keine spezielle !insertmacro Anweisung. Der Titel und der Untertitel werden mit den LangString-Anweisungen definiert.

Fazit

In den drei Teilen haben wir gesehen, dass man relativ einfach einen Installer erstellen kann. Das NSIS Wiki ist dabei das Portal zu verschiedenen Scripts und Code-Schnippseln, die für viele Anforderungen bereits Lösungsvorschlaege bieten.

In meinem Blog werde ich natürlich auch weiterhin Ideen und Lösungen in der Kategorie NSIS posten.

5 Gedanken zu „NSIS Tutorial Teil 3

  1. B. Berlin

    Guten Tag, Herr Baer,

    ganz grosse Klasse; ich habe Ihr Tutorial durchgearbeitet und habe es so schnell verstand wie schon lange nicht mehr. Alle Beispiele konnte ich schnell und feherfrei nachvollziehen.
    Ganz herzlichen Dank für diese Arbeit.

    Beste Grüße in die Schweiz

    Bruno Berlin

    Antworten
  2. Tristan

    Super Tutorial 🙂
    hatte immer nur einen Fehler. Die license Dateien durfen bei mir keine .txt Dateien sein. Sondern sie mussten bei mir .rtf Dateien sein.

    Aber dennoch ein klasse Tutorial !

    Antworten
  3. Ahmed

    Thank you very much for your tutorial. İ was looking a lot in internet but I couldn’t find any better explanation than that. Fortunately I know german language enough to understand reading. Ich werde vebessern meine deutsche auch, fiele danke .

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.