WvdS Shell installieren: Von null bis zur laufenden Anwendung

WvdS Shell ist ein nativer Windows-Anwendungshost für Business-Extensions — gebaut auf Free Pascal und LCL. Diese Anleitung zeigt in fünf Schritten, wie Sie aus dem Quellcode einen Installer bauen, der auf einem sauberen Windows-Rechner sofort läuft.

Bevor Sie starten

Sie brauchen zwei Werkzeuge auf Ihrem Entwicklungsrechner:

  • Lazarus / Free Pascal — kompiliert WvdSShell.exe aus dem Quellcode
  • Inno Setup 6 — baut den Installer (kostenloser Download)

Auf dem Zielrechner ist keines davon nötig. Der fertige Installer bringt alles mit.

Schritt 1: Den Release-Build kompilieren

Öffnen Sie eine PowerShell und starten Sie den Build:

C:\Lazarus\lazbuild.exe WvdSShell.lpi `
  --build-mode=Release `
  --build-all `
  --recursive

Die kompilierten Dateien landen unter binaries\WvdS.Shell\x86_64-win64\Release\.

Prüfen Sie, ob der Build vollständig ist. Im Release-Ordner müssen mindestens diese Dateien liegen:

  • WvdSShell.exe und WvdSShellHelper.exe — die Anwendung selbst
  • libcef.dll und chrome_elf.dll — die Chromium-WebView-Engine
  • libcrypto-3-x64.dll — OpenSSL 3 für Post-Quantum-Kryptographie
  • app.config.json und codicon.ttf — Konfiguration und Icon-Font
  • Die Ordner locales/ und builtins/ — Sprachdaten und eingebaute Extensions

Falls Dateien fehlen, prüfen Sie die Lazarus-Build-Ausgabe auf Fehler.

Die vollständige Ordnerstruktur des Release-Verzeichnisses

Die vollständige Ordnerstruktur des Release-Verzeichnisses

Release/
├── WvdSShell.exe              ← Hauptanwendung
├── WvdSShellHelper.exe        ← CEF Subprocess (zwingend)
├── app.config.json            ← Standardkonfiguration
├── codicon.ttf                ← Icon-Schriftart
│
├── libcef.dll                 ← Chromium Embedded Framework
├── chrome_elf.dll             ← CEF Crash-Handler
├── libEGL.dll                 ← OpenGL ES Layer
├── libGLESv2.dll              ← OpenGL ES 2
├── d3dcompiler_47.dll         ← DirectX Shader-Compiler
├── dxcompiler.dll             ← DirectX 12 Compiler
├── dxil.dll                   ← DirectX IL
├── vk_swiftshader.dll         ← Vulkan Software-Renderer (Fallback)
├── vk_swiftshader_icd.json    ← Vulkan ICD-Konfiguration
├── vulkan-1.dll               ← Vulkan Runtime
│
├── libcrypto-3-x64.dll        ← OpenSSL 3.x (Post-Quantum)
│
├── icudtl.dat                 ← ICU Unicode-Daten
├── resources.pak              ← Chrome-Ressourcen
├── chrome_100_percent.pak     ← UI-Ressourcen (Standard-DPI)
├── chrome_200_percent.pak     ← UI-Ressourcen (High-DPI)
├── v8_context_snapshot.bin    ← V8 JavaScript-Snapshot
│
├── locales/                   ← CEF-Sprachdaten (de.pak, en-US.pak, ...)
│
└── builtins/                  ← Mitgelieferte Erweiterungen
    ├── wvds.extensions/       ← Extension-Manager
    ├── wvds.system/           ← Systemkommandos
    ├── wvds.system.core/      ← Einstellungen, Willkommen-Tab
    ├── wvds.theme-default/    ← 8 eingebaute Themen
    ├── wvds.welcome/          ← Willkommensseite
    └── wvds.workbench/        ← Workbench-Layout

Schritt 2: Das Setup-Skript erstellen

Legen Sie eine neue Datei WvdSShell-Setup.iss an. Dieses Skript sagt dem Inno-Setup-Compiler, welche Dateien der Installer verpackt, wohin er sie kopiert und welche Verknuepfungen er anlegt. Wir bauen es Sektion fuer Sektion auf.

2a. Kopfbereich: Variablen definieren

Am Anfang des Skripts legen Sie Variablen fuer Name, Version und Pfade fest. Passen Sie ReleaseDir an Ihren tatsaechlichen Build-Pfad an — alle weiteren Sektionen greifen darauf zurueck.

; WvdSShell Setup Script
; Inno Setup 6.x
 
#define AppName      "WvdS Shell"
#define AppVersion   "1.0.0"
#define AppPublisher "EMSR DATA, d.o.o."
#define AppURL       "https://www.wvds.at"
#define AppExeName   "WvdSShell.exe"

; ── Anpassen: Pfad zum Release-Build aus Schritt 1 ──────────────────────────
#define ReleaseDir   "D:\Workspace\repos\binaries\WvdS.Shell\x86_64-win64\Release"

2b. [Setup]: Installer-Einstellungen festlegen

Die [Setup]-Sektion bestimmt, wohin installiert wird, wie komprimiert wird und welche Windows-Versionen unterstuetzt sind.

[Setup]
AppId={{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}
AppName={#AppName}
AppVersion={#AppVersion}
AppPublisher={#AppPublisher}
AppPublisherURL={#AppURL}
AppSupportURL={#AppURL}
AppUpdatesURL={#AppURL}
 
DefaultDirName={autopf}\EMSR DATA\WvdS Shell
DefaultGroupName={#AppName}
AllowNoIcons=yes
 
OutputDir=D:\Workspace\release-packages
OutputBaseFilename=WvdSShell-Setup-{#AppVersion}
SetupIconFile={#ReleaseDir}\WvdSShell.exe
 
Compression=lzma2/max
SolidCompression=yes
 
ArchitecturesAllowed=x64compatible
ArchitecturesInstallIn64BitMode=x64compatible
MinVersion=10.0
PrivilegesRequired=admin
 
WizardStyle=modern
WizardResizable=yes
 
[Languages]
Name: "german";   MessagesFile: "compiler:Languages\German.isl"
Name: "english";  MessagesFile: "compiler:Default.isl"

Wichtige Einstellungen im Ueberblick:

  • DefaultDirName — der Zielordner auf dem Benutzerrechner (C:\Program Files\EMSR DATA\WvdS Shell)
  • MinVersion=10.0 — CEF benoetigt mindestens Windows 10
  • PrivilegesRequired=admin — systemweite Installation benoetigt Admin-Rechte
  • Compression=lzma2/max — bestmoegliche Kompression fuer das ~150 MB-Paket

2c. [Tasks]: Optionale Aufgaben anbieten

Tasks sind Optionen, die der Benutzer im Setup-Wizard an- oder abwaehlen kann.

[Tasks]
Name: "desktopicon";    Description: "{cm:CreateDesktopIcon}";    GroupDescription: "{cm:AdditionalIcons}"
Name: "autostart";      Description: "WvdS Shell beim Systemstart starten"; GroupDescription: "Systemstart"; Flags: unchecked

Der Autostart ist standardmaessig deaktiviert (Flags: unchecked) — der Benutzer muss ihn bewusst einschalten.

2d. [Files]: Dateien in den Installer packen

Die [Files]-Sektion ist das Herzstuck des Skripts. Hier listen Sie jede Datei auf, die der Installer verpacken soll. Wir gehen Gruppe fuer Gruppe vor.

Beginnen Sie die Sektion mit dem Schluesselwort [Files] und fuegen Sie dann die folgenden Bloecke nacheinander ein.

Hauptanwendung und Konfiguration

Diese vier Dateien bilden den Kern der Installation:

[Files]
; ── Hauptanwendung ────────────────────────────────────────────────────────────
Source: "{#ReleaseDir}\WvdSShell.exe";          DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\WvdSShellHelper.exe";    DestDir: "{app}"; Flags: ignoreversion

; ── Konfiguration und Schriften ───────────────────────────────────────────────
Source: "{#ReleaseDir}\app.config.json";        DestDir: "{app}"; Flags: ignoreversion onlyifdoesntexist
Source: "{#ReleaseDir}\codicon.ttf";            DestDir: "{app}"; Flags: ignoreversion
  • WvdSShellHelper.exe ist der CEF-Subprocess — ohne ihn startet die WebView nicht
  • app.config.json hat das Flag onlyifdoesntexist: Bei einem Update bleibt die vorhandene Konfiguration erhalten

OpenSSL 3.x

Eine einzige DLL fuer die Post-Quantum-Kryptographie (ML-DSA, ML-KEM):

; ── OpenSSL 3.x (Post-Quantum Kryptographie) ─────────────────────────────────
Source: "{#ReleaseDir}\libcrypto-3-x64.dll";    DestDir: "{app}"; Flags: ignoreversion

Chromium Embedded Framework (CEF)

CEF ist die WebView-Engine. Die Kern-DLLs muessen direkt neben WvdSShell.exe liegen:

; ── CEF-Kern (Rendering-Engine) ──────────────────────────────────────────────
Source: "{#ReleaseDir}\libcef.dll";             DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\chrome_elf.dll";         DestDir: "{app}"; Flags: ignoreversion

libcef.dll allein macht rund 100 MB aus — das ist der groesste Anteil am Installer.

GPU-Unterstuetzung: OpenGL, DirectX und Vulkan

Diese DLLs ermoeglichen hardwarebeschleunigtes Rendering. Auf Rechnern ohne GPU springt der Vulkan-Software-Renderer als Fallback ein:

; ── OpenGL / DirectX ─────────────────────────────────────────────────────────
Source: "{#ReleaseDir}\libEGL.dll";             DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\libGLESv2.dll";          DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\d3dcompiler_47.dll";     DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\dxcompiler.dll";         DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\dxil.dll";               DestDir: "{app}"; Flags: ignoreversion

; ── Vulkan Software-Renderer (Fallback ohne GPU) ────────────────────────────
Source: "{#ReleaseDir}\vk_swiftshader.dll";     DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\vk_swiftshader_icd.json";DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\vulkan-1.dll";           DestDir: "{app}"; Flags: ignoreversion

CEF-Ressourcen und Sprachdateien

Chromium benoetigt Unicode-Daten, UI-Ressourcen und einen V8-Snapshot. Die Sprachdateien liegen in einem eigenen Unterordner:

; ── CEF-Ressourcen ───────────────────────────────────────────────────────────
Source: "{#ReleaseDir}\icudtl.dat";             DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\resources.pak";          DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\chrome_100_percent.pak"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\chrome_200_percent.pak"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#ReleaseDir}\v8_context_snapshot.bin";DestDir: "{app}"; Flags: ignoreversion

; ── CEF-Sprachdateien (alle locales) ────────────────────────────────────────
Source: "{#ReleaseDir}\locales\*";              DestDir: "{app}\locales"; Flags: ignoreversion recursesubdirs

Die zwei chrome_*_percent.pak-Dateien enthalten UI-Ressourcen fuer Standard- und High-DPI-Displays.

Eingebaute Erweiterungen (Builtins)

Die mitgelieferten Extensions (Themen, Workbench, System) werden als kompletter Ordnerbaum kopiert:

; ── Eingebaute Erweiterungen ──────────────────────────────────────────────────
Source: "{#ReleaseDir}\builtins\*";             DestDir: "{app}\builtins"; Flags: ignoreversion recursesubdirs createallsubdirs

Das Flag createallsubdirs sorgt dafuer, dass auch leere Unterordner angelegt werden — einige Extensions erwarten bestimmte Verzeichnisse.

2e. [Dirs]: Benutzerverzeichnisse anlegen

WvdS Shell speichert Erweiterungen und Logs im lokalen Benutzerprofil. Diese Ordner legt der Installer vorab an — ohne Admin-Rechte, da %LOCALAPPDATA% dem Benutzer gehoert.

[Dirs]
Name: "{localappdata}\.wvdx\extensions"
Name: "{localappdata}\.wvdx\logs"

2f. [Icons] und [Registry]: Verknuepfungen und Systemintegration

Zuletzt richten Sie Startmenue-Eintraege, Desktop-Icon und optionalen Autostart ein.

[Icons]
Name: "{group}\{#AppName}";                    Filename: "{app}\{#AppExeName}"
Name: "{group}\{#AppName} deinstallieren";     Filename: "{uninstallexe}"
Name: "{autodesktop}\{#AppName}";              Filename: "{app}\{#AppExeName}"; Tasks: desktopicon
 
[Registry]
; Autostart (nur wenn der Benutzer die Task gewaehlt hat)
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run";
  ValueType: string; ValueName: "{#AppName}"; ValueData: """{app}\{#AppExeName}""";
  Flags: uninsdeletevalue; Tasks: autostart

; App-Pfad: ermoeglicht Start ueber Win+R → "WvdSShell"
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WvdSShell.exe";
  ValueType: string; ValueName: ""; ValueData: "{app}\{#AppExeName}"; Flags: uninsdeletekey
 
[Run]
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}";
  Flags: nowait postinstall skipifsilent
 
[UninstallDelete]
; Benutzerdaten bewusst NICHT loeschen — bei Bedarf einkommentieren:
; Type: filesandordirs; Name: "{localappdata}\.wvdx"

Die [Run]-Sektion bietet dem Benutzer am Ende des Setups an, WvdS Shell sofort zu starten. Das Desktop-Icon und der Autostart-Eintrag werden nur angelegt, wenn der Benutzer die entsprechende Task in Schritt 2c gewaehlt hat.

Schritt 3: Den Installer kompilieren

Uebergeben Sie das Skript an den Inno-Setup-Compiler:

& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" "WvdSShell-Setup.iss"

Alternativ: Oeffnen Sie die .iss-Datei per Doppelklick in der Inno Setup IDE und waehlen Sie Build > Compile.

Der fertige Installer liegt danach unter:
D:\Workspace\release-packages\WvdSShell-Setup-1.0.0.exe

Schritt 4: Den Installer testen

Starten Sie WvdSShell-Setup-1.0.0.exe auf einem sauberen Windows 10 oder 11 (64-Bit). Der Installer braucht keine Vorinstallation — alle Abhaengigkeiten sind enthalten.

Nach der Installation und dem ersten Start von WvdS Shell passiert automatisch:

  1. WvdS Shell legt %LOCALAPPDATA%\.wvdx\ an (Benutzerdaten)
  2. Die Logdatei %LOCALAPPDATA%\.wvdx\logs\wvds-shell.log wird erstellt
  3. Die eingebauten Erweiterungen aus builtins\ werden gescannt und registriert
  4. Der Willkommens-Tab oeffnet sich

Schritt 5: Eigene Extensions hinzufuegen

Sobald WvdS Shell laeuft, gibt es zwei Wege, um Erweiterungen zu installieren:

  • Kommandozeile: WvdSShell.exe –install <pfad.wvdx>
  • Grafisch: Ueber den eingebauten Extension-Manager (erreichbar ueber die Activity Bar)

Die Erweiterungen landen unter %LOCALAPPDATA%\.wvdx\extensions\.


Fuer Fortgeschrittene

Node.js in den Installer einbinden

WvdS Shell braucht Node.js als Extension-Host fuer JavaScript-Extensions. Ohne Node.js laeuft die Shell trotzdem, aber JS-Extensions sind nicht verfuegbar.

Es gibt drei Wege, damit umzugehen — je nach Deployment-Szenario:

Variante A: Nur pruefen und warnen (empfohlen)

Die einfachste Loesung: Der Installer prueft beim Start, ob Node.js installiert ist, und zeigt einen Hinweis, falls nicht. Die Installation wird nicht blockiert.

Fuegen Sie diese [Code]-Sektion am Ende Ihres ISS-Skripts ein:

[Code]
function NodeJsInstalled: Boolean;
var
  Version: String;
begin
  Result := RegQueryStringValue(HKLM,
    'SOFTWARE\Node.js',
    'Version', Version);
end;
 
function InitializeSetup: Boolean;
begin
  Result := True;
  if not NodeJsInstalled then
  begin
    MsgBox(
      'Node.js ist nicht installiert.' + #13#10 +
      'Bitte Node.js 20 LTS (oder neuer) von https://nodejs.org installieren.' + #13#10 +
      'Die Shell laeuft auch ohne Node.js, aber JS-Extensions sind nicht verfuegbar.',
      mbInformation, MB_OK);
  end;
end;

Wann sinnvoll: Fuer die meisten Szenarien. Der Benutzer installiert Node.js selbst ueber nodejs.org oder den IT-Administrator.

Variante B: Node.js-Setup als Prerequisite ausfuehren

Der Installer bringt das offizielle Node.js-MSI mit und fuehrt es vor der eigentlichen Installation aus — aber nur, wenn Node.js noch nicht vorhanden ist.

Schritt 1: Laden Sie das Node.js-MSI herunter und legen Sie es neben Ihr ISS-Skript:

# Node.js 22 LTS (x64) herunterladen
Invoke-WebRequest -Uri "https://nodejs.org/dist/v22.14.0/node-v22.14.0-x64.msi" `
  -OutFile "node-v22.14.0-x64.msi"

Schritt 2: Fuegen Sie das MSI in die [Files]-Sektion ein. Es wird nur temporaer entpackt:

; ── Node.js Prerequisite (temporaer) ────────────────────────────────────────
Source: "node-v22.14.0-x64.msi"; DestDir: "{tmp}"; Flags: deleteafterinstall; Check: not NodeJsInstalled
  • DestDir: „{tmp}“ — die Datei landet im temporaeren Verzeichnis, nicht im Installationsordner
  • deleteafterinstall — nach der Installation wird das MSI automatisch geloescht
  • Check: not NodeJsInstalled — das MSI wird nur entpackt, wenn Node.js fehlt

Schritt 3: Fuegen Sie einen [Run]-Eintrag hinzu, der das MSI vor dem ersten Start der Shell ausfuehrt:

[Run]
; Node.js installieren (nur wenn nicht vorhanden, vor Shell-Start)
Filename: "msiexec.exe"; Parameters: "/i ""{tmp}\node-v22.14.0-x64.msi"" /passive /norestart"; \
  StatusMsg: "Node.js wird installiert..."; Check: not NodeJsInstalled; \
  Flags: shellexec waituntilterminated
  • /passive — zeigt einen Fortschrittsbalken, fragt aber nichts
  • /norestart — verhindert einen Neustart nach der Node.js-Installation
  • waituntilterminated — der Installer wartet, bis das MSI fertig ist

Schritt 4: Die [Code]-Sektion fuer die Prueffunktion bleibt gleich wie in Variante A:

[Code]
function NodeJsInstalled: Boolean;
var
  Version: String;
begin
  Result := RegQueryStringValue(HKLM,
    'SOFTWARE\Node.js',
    'Version', Version);
end;

Wann sinnvoll: Fuer Einzelplatz-Installationen, bei denen der Benutzer sich nicht selbst um Node.js kuemmern soll. Beachten Sie, dass das MSI rund 30 MB zum Installer hinzufuegt.

Variante C: Node.js als Portable-Version mitliefern

Statt einer systemweiten Installation kopieren Sie eine portable Node.js-Version direkt in den WvdS-Shell-Ordner. WvdS Shell sucht node.exe zuerst im eigenen Verzeichnis.

Schritt 1: Laden Sie die Portable-Version (ZIP) herunter und entpacken Sie sie:

# Node.js 22 LTS Portable (x64) herunterladen und entpacken
Invoke-WebRequest -Uri "https://nodejs.org/dist/v22.14.0/node-v22.14.0-win-x64.zip" `
  -OutFile "node-portable.zip"
Expand-Archive "node-portable.zip" -DestinationPath "node-portable"

Schritt 2: Kopieren Sie nur die benoetigten Dateien (node.exe und die zugehoerigen DLLs) in Ihr Release-Verzeichnis unter einen node\-Unterordner.

Schritt 3: Fuegen Sie den Ordner in die [Files]-Sektion ein:

; ── Node.js Portable ────────────────────────────────────────────────────────
Source: "{#ReleaseDir}\node\*"; DestDir: "{app}\node"; Flags: ignoreversion recursesubdirs createallsubdirs

Schritt 4: Setzen Sie per [Registry] den Pfad, damit WvdS Shell die portable Version findet:

[Registry]
Root: HKCU; Subkey: "Software\EMSR DATA\WvdS Shell"; \
  ValueType: string; ValueName: "NodePath"; ValueData: "{app}\node\node.exe"; \
  Flags: uninsdeletevalue

Wann sinnvoll: Fuer Unternehmens-Deployments, die eine kontrollierte Node.js-Version erfordern und keine systemweite Installation erlauben. Beachten Sie, dass die portable Version rund 80 MB zum Installer hinzufuegt.

Welche Variante waehlen?

Kriterium A: Nur warnen B: MSI-Prerequisite C: Portable
Installer-Groesse +0 MB +30 MB +80 MB
Node.js-Updates Benutzer/IT Benutzer/IT Neuer Installer noetig
Admin-Rechte fuer Node Nicht noetig Ja (MSI) Nein
Offline-faehig Nein Ja Ja
Kontrolle ueber Version Keine Teilweise Vollstaendig

Silent Install fuer Unternehmens-Deployment

Fuer automatisierte Rollouts unterstuetzt der Installer die Inno-Setup-Standardschalter:

# Stille Installation (Fortschrittsbalken sichtbar, keine Benutzereingaben)
WvdSShell-Setup-1.0.0.exe /SILENT /NORESTART
 
# Vollstaendig lautlos (kein Fenster, Logdatei schreiben)
WvdSShell-Setup-1.0.0.exe /VERYSILENT /NORESTART /LOG="C:\Temp\wvds-install.log"
 
# Benutzerdefinierter Installationspfad
WvdSShell-Setup-1.0.0.exe /VERYSILENT /DIR="C:\Programme\WvdS Shell"

Uebersicht: Was steckt im Installer?

Komponente Im Installer Lizenz Zweck
WvdSShell.exe Ja Proprietaer Hauptanwendung
WvdSShellHelper.exe Ja Proprietaer CEF-Subprocess (zwingend)
libcef.dll + CEF-DLLs Ja BSD/MIT Chromium WebView-Engine
libcrypto-3-x64.dll Ja Apache 2.0 OpenSSL 3 (Post-Quantum)
DirectX / Vulkan DLLs Ja Microsoft/MIT GPU-Rendering
builtins/ Ja Proprietaer Eingebaute Extensions
Node.js Nein MIT Separat installieren (optional)

Das fertige Setup umfasst rund 120-160 MB. Den Grossteil machen die CEF-Chromium-Binaries aus.

Fragen zum Deployment? | Zurueck zum Blog

Zuletzt geändert: den 08.03.2026 um 02:11