Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:apex_application_url_handler_local_apps

Oracle APEX - Im Interactiv Grid Bericht eine lokale Desktop App mit dem Werten der aktuellen Zeile als Parameter aufrufen

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:

  • Registry auf dem Client anpassen
  • Das aufzurufende Programm auf dem Client hinterlegen/installieren
  • Aufruf Link mit Parametern um IG als Template hinterlegen
  • Testen

Application URL - Lokale Windows Applikationen aus dem Browser mit Parametern aufrufen

Ü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.)


Bestehenden Protocol Handler für Office Produkte verwenden

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>:

  • Bedeutung: Öffnet das Dokument zur Bearbeitung.
  • Beispiel: ms-word:ofe|u|https://example.com/document.docx
  • ms-word:ofv|u|<URL>:
  • Bedeutung: Öffnet das Dokument im schreibgeschützten Modus.
  • Beispiel: ms-word:ofv|u|https://example.com/document.docx
  • ms-word:nft|u|<URL>:
  • Bedeutung: Öffnet das Dokument im Entwurfsmodus.
  • Beispiel: ms-word:nft|u|https://example.com/document.docx
  • ms-word:ofe|u|file:///C:/Pfad/zum/Dokument.docx:
  • Bedeutung: Öffnet ein lokales Dokument zur Bearbeitung.
  • Beispiel: ms-word:ofe|u|file:///C:/Users/IhrBenutzername/Documents/BeispielDokument.docx

Mehr dazu unter https://learn.microsoft.com/en-us/office/client-developer/office-uri-schemes

Test mit statischen HTML

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.


Einen neuen Protocol Handler für den Aufruf eines eigenen Programmes / Skripts verwenden

Einen Handler in der Registiry des Client hinterlegen

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.

In die Registry importieren
importGpiAction.reg
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""

Programm auf dem Client hinterlegen

Das Test Programm im passenden Pfad auf dem Client anlegen

C:\temp\gpiaction_parmeter.cmd:

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.


Integration in APEX Bericht

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>

 Call Application Protokoll Handler


Aufruf des Handlers

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:

 ask user to open external app

Und es wird das Demo Programm gestartet.

 open external script demo


Wie überprüfen ob der Custom Protokoll Handler da ist?

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:

Check mit registerProtocolHandler

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/

Aufruf der Applikation URL in JavaScript zum testen

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.

Abfangen der Fehlermeldung

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.


Quellen

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
prog/apex_application_url_handler_local_apps.txt · Zuletzt geändert: von gpipperr