====== 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.
~~READMORE~~
===== 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 ([[https://jrsoftware.org/isinfo.php|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.
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:
- WvdS Shell legt ''%LOCALAPPDATA%\.wvdx\'' an (Benutzerdaten)
- Die Logdatei ''%LOCALAPPDATA%\.wvdx\logs\wvds-shell.log'' wird erstellt
- Die eingebauten Erweiterungen aus ''builtins\'' werden gescannt und registriert
- 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 ''
* **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 [[https://nodejs.org|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.
[[de:pub:kontakt|Fragen zum Deployment?]] | [[de:pub:blog:start|Zurueck zum Blog]]