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.
Sie brauchen zwei Werkzeuge auf Ihrem Entwicklungsrechner:
Auf dem Zielrechner ist keines davon nötig. Der fertige Installer bringt alles mit.
Ö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 selbstlibcef.dll und chrome_elf.dll — die Chromium-WebView-Enginelibcrypto-3-x64.dll — OpenSSL 3 für Post-Quantum-Kryptographieapp.config.json und codicon.ttf — Konfiguration und Icon-Fontlocales/ und builtins/ — Sprachdaten und eingebaute ExtensionsFalls Dateien fehlen, prüfen Sie die Lazarus-Build-Ausgabe auf Fehler.
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.
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"
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 10PrivilegesRequired=admin — systemweite Installation benoetigt Admin-RechteCompression=lzma2/max — bestmoegliche Kompression fuer das ~150 MB-PaketTasks 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.
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.
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 nichtapp.config.json hat das Flag onlyifdoesntexist: Bei einem Update bleibt die vorhandene Konfiguration erhaltenEine 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
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.
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
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.
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.
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"
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.
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
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:
%LOCALAPPDATA%\.wvdx\ an (Benutzerdaten)%LOCALAPPDATA%\.wvdx\logs\wvds-shell.log wird erstelltbuiltins\ werden gescannt und registriertSobald WvdS Shell laeuft, gibt es zwei Wege, um Erweiterungen zu installieren:
WvdSShell.exe –install <pfad.wvdx>
Die Erweiterungen landen unter %LOCALAPPDATA%\.wvdx\extensions\.
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:
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.
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 Installationsordnerdeleteafterinstall — nach der Installation wird das MSI automatisch geloeschtCheck: 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-Installationwaituntilterminated — 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.
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.
| 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 |
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"
| 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.