Einige Vertec Schnittstellen zu Drittprogrammen basieren auf einer COM Schnittstelle zum Fremdsystem. Da die Verbindung jedoch nur lokal, d.h. auf demselben Rechner, funktioniert, sind diese Schnittstellen nicht cloudfähig und können nur mit der Vertec Desktop App und demnach nur On-Premises verwendet werden.
Mit dem COM Forwarding führen wir mit Vertec 6.7.0.7 ein Proxy-System ein, mit welchem auch aus der Cloud App auf die COM Objekte des Fremdsystems zugegriffen werden kann.
So können im serverseitigen Python-Code COM Forwarding Proxy Objekte verwendet werden, deren Aktionen dann an die Cloud App weitergeleitet und dort auf die eigentlichen COM Objekte des Drittprogramms angewendet werden.
So läuft das COM Forwarding ab:
- Proxy Objekte in Python (Klasse
ComFwProxy
) fangen Aufrufe (Methoden, Attribute get/set) ab und verpacken sie in Messages.
- Adapter Objekte führen die Aktion in der Cloud App auf dem "echten" COM Interface aus.
- Es gibt ein Message / Response Pattern zwischen Proxy Objekt und Adapter Objekt.
- Der Einstieg erfolgt via Python Funktion
vtccom.createobject(identifier)
.
Funktionsumfang
Die Implementierung der COM Forwarding Proxy Objekte lehnt sich an die dynamischen COM Objekte aus win32com.client.dynamic
an. Ein COM Forwarding Proxy Objekt implementiert jedoch nur die folgenden Python Standard Methoden:
- __getattr__ für Lesezugriffe auf COM Properties und Bereitstellung von Methoden.
- __setattr__ für Schreibzugriffe auf COM Properties.
- __repr__ Stringdarstellung des Proxy Objekts, zu Debugging-Zwecken. Enthält den identifier.
- __del__ wird von Python aufgerufen, sobald das Objekt nicht mehr referenziert wird.
Modul vtccom
Die Funktionalitäten für das COM Forwarding werden im Modul vtccom mitgeliefert. Dieses ist auch als Stub File vorhanden.
Bestehende, nicht cloudfähige Schnittstellen umbauen
Schnittstellen, welche COM Forwarding verwenden, funktionieren auch in der Desktop App unverändert.
Falls Sie in Vertec (andere als die standardmässig mitgelieferten) Schnittstellen mit COM Zugriffen auf Drittprogramme verwenden und diese an COM Forwarding anpassen möchten, müssen Sie folgende Änderungen vornehmen:
vtccom.createobject statt win32com.Dispatch
Die Aufrufe der COM Objekte erfolgen mittels vtccom.createobject(identifier)
anstelle von win32com.Dispatch
.
Dafür muss das Modul vtccom importiert und die Aufrufe wie folgt geändert werden:
Neu |
Bisher |
import vtccom
self.invoice = vtccom.createobject('ThirdPartyAPI.Invoice')
|
from win32com.client import Dispatch
self.invoice = Dispatch('ThirdPartyAPI.Invoice')
|
import vtccom
word = vtccom.createobject("Word.Application")
word.Visible = True
doc = word.Documents.Add()
doc.SaveAs(r"C:\temp\Test Document.docx")
|
from win32com.client import Dispatch
Word = Dispatch('Word.Application')
Word.Visible = True
doc = Word.Documents.Add()
doc.SaveAs(r"C:\temp\Test Document.docx")
|
Für die Sicherstellung der Rückwärtskompatibilität liefert vtccom.createobject()
in der Desktop App das originale COM Objekt zurück.
Nicht zugelassene Module ausbauen
Damit die Schnittstellen mit COM Forwarding auch mit Restrict Scripting funktionieren, müssen Aufrufe von Modulen wie sys oder pywintypes ausgebaut werden. Es dürfen nur Module verwendet werden, die auf der Whitelist stehen.
Funktionsumfang der COM Objekte beachten
Die Vertec COM Forwarding Proxy Objekte implementieren nur eine begrenzte Anzahl von Methoden (siehe oben). Werden Schnittstellen an COM Forwarding angepasst, können nur noch die entsprechenden Methoden verwendet werden.
Es kann auch sein, dass die Verwendung der Vertec COM Forwarding Proxy Objekte nicht mit allen via win32com.Dispatch verfügbaren COM Schnittstellen möglich ist.
Sicherheit
Um zu vermeiden, dass ein Script mit COM Forwarding auf dem Server "unbemerkt" Code in der Cloud App ausführt, wird der Benutzer des Clients einmalig um Erlaubnis gefragt, wenn ein COM Server auf dem Client aufgerufen wird. Diese Erlaubnis wird für zukünftige Aufrufe auf dem Client gespeichert.
Beim Zugriff auf einen COM Server via COM Forwarding (Aufruf von vtccom.createobject()
) erscheint in der Cloud App ein Dialog, dass ein Server Script versucht, auf dieses Objekt auf dem Client zuzugreifen.
- Wird der Zugriff erlaubt, wird das Script ausgeführt und die Erlaubnis auf dem Client gespeichert. Bei zukünftigen Aufrufen desselben COM Servers erscheint die Abfrage nicht mehr.
- Wird der Zugriff nicht erlaubt, bricht die Ausführung ab, ohne dass eine Meldung erscheint. Bei wiederholtem Aufruf erscheint die Meldung erneut.
Die von uns mitgelieferten Buchhaltungsschnittstellen mit COM Forwarding sind bereits hinterlegt. Bei ihnen kommt diese Abfrage also auch beim erstmaligen Aufruf nicht.