Aufgabe
Ein ERP System verwendet für das Berichtwesen eine APEX Applikation auf den gleichen Datenbestand.
Das ERP System ist eine C++ Anwendung unter MS Windows, also eine klassische Desktop Applikation.
Die Anwendung lässt sich aber so parametrisieren (beim Aufruf und im laufenden Zustand), das ein Anwender direkt auf die passende Maske für die in APEX gefunden Daten gelenkt werden kann.
Der Anwender soll nun über eine Link in einem Interactive Grid die lokale C++ APP mit entsprechenden Parameter starten bzw. wenn schon offen auf die richtige Maske steuern.
Lösung
Für solche Aufgaben kann das „Application URL“ Feature verwendet werden.
Der Browser prüft ob für die URL ein Protokoll Handler im OS definiert ist und ruft dann das entsprechende Programm auf.
Das funktioniert in aktuellen Edge, Chrome und Firefox (unter Windows 11 getestet).
Ablauf:
Über eine URL im Format <Protokoll-Type>://path/myprogram.exe kann über den Browser eine zuvor registrierte Applikation über einen in der Registry definierten Protokoll-Handler aufgerufen werden.
Dem Protokoll Handler kann ein Parameter übergeben werden, sollen mehrere Parameter übergeben werden muss der Handler APP am Ende dann selber den einen Parameter parsen (getrennt mit einem, nicht in den Daten enthaltenen, Zeichen oder als ein BASE64 codiertes JSON Fragment etc.)
Per Default funktioniert das für alle registrierten Office Programme wie MS Wort, sobald diese auch lokal installiert sind.
Im Edge wird dazu das folgende Format verwendet "ms-word:ofe|u|file:///C:/path/to/word_okument.docx" wie ms-word:ofe|u|file:///C:/temp/word_text_dokument.docx"
In älteren Chrome Versionen kann das evtl. nicht funktioniert, in Chrome der Version 136.0.7103.94 (prüfen über chrome://version/ <n/owiki>) funktioniert der Aufruf aber ohne, das ein eigener Handler definiert werden muss. == Der MS Word Handler - Varianten des **ms-word** Protokolls == Der **ms-word** Handler bietet verschiedene Befehle, die unterschiedliche Aktionen in Microsoft Word auslösen können, wie: * <nowiki>ms-word:ofe|u|<URL>:
Mehr dazu unter https://learn.microsoft.com/en-us/office/client-developer/office-uri-schemes
Zuvor Word Dokument unter c:\temp anlegen.
<!DOCTYPE html> <html> <head> <title>Test MS Word Handler</title> </head> <body> <a href="ms-word:ofe|u|file:///C:/temp/word_text_dokument.docx">Öffne im Browser ein Text Dokument </a> </body> </html>
Der Browser fragt den Anwender, ob Word geöffnet werden soll und Word wird sofort geöffnet.
Auf allen PC's im Unternehmen muss vorab der Registry Key und die referenzierte Helper APP importiert/installiert werden.
Dazu werden die vorhanden Software Verteil-Methoden eingesetzt.
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\gpiaction] @="URL:gpiaction" "URL Protocol"="" "UseOriginalUrlEncoding"=dword:00000001 [HKEY_CLASSES_ROOT\gpiaction\DefaultIcon] @="\"C:\\temp\\gpiaction_parmeter.cmd\",1" [HKEY_CLASSES_ROOT\gpiaction\shell] [HKEY_CLASSES_ROOT\gpiaction\shell\open] [HKEY_CLASSES_ROOT\gpiaction\shell\open\command] @="\"C:\\temp\\gpiaction_parmeter.cmd\" \"%1\""
Danach haben wir folgenden Key:
HKEY_CLASSES_ROOT └── gpiaction ├── (Standard) = "URL:gpiaction" ├── URL Protocol = "" ├── DefaultIcon │ └── (Standard) = "C:\\temp\\gpiaction_parmeter.cmd,1" ├── shell │ └── open │ └── command │ └── (Standard) = "C:\\temp\\gpiaction_parmeter.cmd "%1""
Das Test Programm im passenden Pfad auf dem Client anlegen
C:\temp\gpiaction_parmeter.cmd:
@echo ----------- @echo Found Parameters %1 pause @echo -----------
Mit dieser einfachen Test CMD kann der generelle Ablauf getestet werden, später wird hier ein kleines Helper Programm den übergebenen String parsen und dann das entsprechende ausführen.
Um sicher Links im Interactive Grid zu hinterlegen wird eine Spalte vom Typ „HTML Expression“ angelegt und die notwendigen Parameter werden mit der &COLUMN. Syntax als ein String mit definiert Trennzeichen hinterlegt.
<a href="gpiaction:&RGB_COLOR.+&SEARCH_COLOR.+&JCOLOR_VECTOR.">Öffne die GPI Action mit dem Suchvektor</a>
Beim Aufruf erscheint im Browser Fenster beim ersten Mal (oder jedes mal wenn der Anwender die Check Box nicht auswählt) ein Hinweis, das nun ein lokales Programm geöffnet wird.
Das funktioniert sogar im Firefox, hier der Screenshot vom Firefox:
Und es wird das Demo Programm gestartet.
Wie kann aber sichergestellt werden ob der Link auch funktioniert? Also der Action Handler auch im OS registriert ist?
Ist das nicht der Fall, soll der Anwender mit einer lesbaren Meldung darauf hingewiesen werden und kann z.b. dann die notwendige Client APP herunterladen und installieren.
Leider ist das aus Sicherheitsgründen nicht trivial, auch lässt sich die Fehlermeldung schlecht abfangen. Ohne Benutzer Interaktion lässt der Browser nicht zu „silent“ danach zu fragen, am Ende wäre da ja auch eine größere Sicherheitslücke.
Citrix / Zoom & Co haben da in ihren Startseiten nun ganze eigene Methoden implementiert, die recht kompliziert aussehen um hier diese Benutzerfreundlich zu erreichen.
Das Ganze lohnt sich am Ende aber wohl nur bei APEX Applikationen die eine größere Anzahl von Anwender haben in nicht standardisierbaren Umgebungen.
Wie könnte es gehen:
Leider kann für eine lokale Methode nicht der registerProtocolHandler nicht verwendet werden
registerProtocolHandler - The Navigator method registerProtocolHandler() lets websites register their ability to open or handle particular URL schemes (also known as protocols). - see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/registerProtocolHandler
Ideen: Siehe https://paul.kinlan.me/detecting-if-a-url-scheme-can-be-handled/
Mit etwas JavaScript kann versucht werden einen IFRAME mit den Aufruf zu füllen, allerdings funktioniert das nur wenn der Anwender dann das ganze bestätigt, ein Silent Check ist aus Sicherheitsgründen wohl nicht implantierbar.
In der Browser Console sieht man die Meldung wenn der Handler nicht registriert ist:
Prevented navigation to “gpiaction:648fa9++[[202.60869,40.83,66.27]]” due to an unknown protocol.
Leider habe ich noch kein Event Handler in JavaScript gefunden, der von dieser Meldung getriggert wird, der einfachste wie der Event Handler „window.onerror“ zündet bei mir hier nicht. Da ist noch etwas Forschung angesagt.