====== 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]]