Grundlagen COM

Module: Leistung & CRM
Erstellt: 26.06.2003, Änderung: 03.02.2017
Übergabe von Variants an den COM Proxy dokumentiert.
Mehr ansehen

Über die COM-Schnittstelle (oder ActiveX-Schnittstelle) kann Vertec von aussen ganz ähnlich ferngesteuert werden wie über VBScript. Tatsächlich benutzt das Vertec Script die genau gleiche COM-Schnittstelle für die Vertec Objekte. In den folgenden Beispielen wird von MS-Excel aus auf Vertec zugegriffen, genauso gut könnte der Zugriff aber von jedem Programmiersystem aus erfolgen.

Vertec Type Library

Die Vertec Applikation (Vertec.exe) kann von anderen Applikationen aus als "out-of-process" COM Server verwendet werden. Die Type Library dazu ist in Vertec.exe enthalten. Dazu muss als erstes die Vertec Type Library referenziert werden. Dies geschieht im Visual Basic Editor über das Menü Extras > Verweise. Es öffnet sich folgendes Fenster (je nach Windows sieht das Fenster ev. etwas anders aus):

Die nicht markierten Einträge sind alphabetisch sortiert. Suchen Sie den Eintrag Vertec Typelibrary und markieren Sie ihn. Wenn Sie das Fenster erneut öffnen, sollte der Eintrag Vertec Typelibrary wie hier dargestellt erscheinen.

Die Vertec.App Komponente kann mit oder ohne Type-Library Unterstützung verwendet werden. Wir empfehlen jedoch, die obigen Schritte vorzunehmen, da dann je nach Entwicklungsumgebung (z.B. VB) automatische Code-Completion und compile-time type checking zur Verfügung stehen.

Objektkatalog

Für einen Überblick über die verfügbaren Objekte (genauer: Interfaces) können Sie im VB-Editor den Objektkatalog über Ansicht > Objektkatalog aufrufen. Wählen Sie anschliessend in der Combo-Box oben Vertec, und es erscheint folgende Ansicht:

Hier im Beispiel werden die Methoden (als Symbol die grünen Würfel) und Eigenschaften (als Symbol die Hand) des IVtcObject dargestellt.

Eine genaue Beschreibung der wichtigsten Klassen siehe im Kapitel COM Interfaces.

Anpassungen COM für Kompatibilität mit .NET (Cloud-​App)

Im Rahmen der Unterstützung der COM Schnittstelle in der Cloud App musste für Vertec 6.0 die COM Typelibrary geringfügig angepasst werden, damit diese mit dem .NET COM Server kompatibel ist.

Die Cloud App bietet lokal einen COM Server an, obwohl gar keine Business-Logik vorhanden ist. Dies wird nun mit einem Proxy zum eigentlichen COM Server, der auf dem Server in der Vertec Session läuft, simuliert. Der Verkehr läuft dabei über die normale Datenleitung (und ist darum eher nicht geeignet für Datenmigration und schwere Excel-Reports). Wegen dieser Neuimplementation mussten gewisse Dinge an der Type-Library geändert werden.

Arbeitet man mit Microsoft Office und bindet die Type-Library ein ("Verweise"), siehe oben, so funktioniert alles wie bisher. Bindet man keine Type-Library ein, so ergibt sich ein wichtiger Unterschied:

Setter-​Methoden

Das Schreiben eines Members über

projekt.Member("code") = "WINCO"

wirft einen Fehler.

Darum wurden neue Methoden eingeführt, welche in allen Apps und unabhängig von der Type-Library laufen:

projekt.SetMember "code", "WINCO"

Es gibt im Ganzen drei solche neuen Setter-Methoden, diese sind:

  • SetMember
  • SetZusatzfeld
  • SetZusatzfeldAsVariant

Es geht dabei nur um den externen Zugriff via COM und daher nur um die Cloud App - nicht um eingebaute Scripts etc. Potenziell davon betroffen sind auch Excel-Berichte, da diese ebenfalls über COM auf Vertec zugreifen. Da diese aber selten Members schreiben und via Cloud App auch keine Migrationen gemacht werden (sollten), wird das in den allermeisten Fällen keine Auswirkungen haben.

TypeName()

Eine weitere Änderung gibt es bei der Funktion TypeName(). Diese gibt in der Cloud App einen anderen Namen zurück als bisher. Reports, welche die Funktion TypeName() verwenden, müssen angepasst werden.

Die entsprechenden Namen für die COM Interfaces im Proxy (Cloud App) sind:

Resultat bisherResultat neu
AppComCoClass
IVtcObjectVtcObjectProxy
IVtcObjectListVtcObjectListProxy
ITimBearbeiterTimBearbeiterProxy
? 

Mit Ausnahme von App wird der ClassName + "Proxy"  zurückgegeben.

Übergabe von Variants an den COM Proxy

Falls die TypeLibrary nicht eingebunden ist, gibt es eine Eigenheit bei der Übergabe von Variants an den ComProxy::

Sub TestVariantPassing()
    Dim Vertec As Object
    Dim Projektbearbeiter As Variant
    Dim ObjectList As Object
    
    Set Vertec = CreateObject("Vertec.App")
    Set Projektbearbeiter = Vertec.CurrentObject
    Set ObjectList = Vertec.CreateList("Projektbearbeiter")
    ObjectList.Add Projektbearbeiter
End Sub

Das Hinzufügen eines Projektbearbeiters als Variant funktioniert nicht und meldet Ungültiger Prozeduraufruf oder ungültiges Argument. Wird der Projektbearbeiter allerdings als als Object deklariert funktioniert alles problemlos.

Davon betroffen sind generell Funktionen, welche ein spezifisches Objekt (IVtcObject, IVtcObjectList, ITimBearbeiter etc.) als Parameter akzeptieren. Als Übergabe zählt auch eine Zuweisung. Beispiele:

IVtcObjectList
  • HRESULT Add([in] IVtcObject* obj);
  • HRESULT Remove([in] IVtcObject* obj);
  • HRESULT AddList([in] IVtcObjectList* list);
  • HRESULT IndexOf([in] IVtcObject* item, [out, retval] VARIANT_BOOL* result)
IVtcSession
  • HRESULT ScriptExecute
  • HRESULT SetResourcePlanValue
  • HRESULT EvalToVariable
  • HRESULT ExecuteFileReport
  • ...

Als Variant Deklarierte Objekte sollten deshalb nicht an den COM Proxy übergeben werden.