Komplexe Parameter mit Gupta-COM

Mit dem Gupta Team Developer lassen sich COM-Objekte erzeugen, so dass man deren Funktionalität in anderen Programmiersprachen – z.B. C# –­ nutzen kann. Wie das geht, ist im Artikel https://thomasuttendorfer.wordpress.com/2010/06/17/von-apd-uber-com-nach-soap-teil-1/ beschrieben.

Bislang hatte ich in den COM-Funktionen stets die generischen Datentypen String, DateTime und Number als Rückgabewert oder Parameter verwendet. Receive-Parameter sind ebenfalls möglich und nötig, wenn man z.B. einen kompletten Datensatz übergeben möchte. Allerdings sind die Parameterlisten der COM-Funktionen dann oft lang und unübersichtlich. Die Pflege, das Erweitern und Verwenden dieser Funktionen ist lästig und fehleranfällig. Der Wunsch, komplexe Parameter – also Klassen und deren Instance-Variablen – übergeben zu können, wurde immer größer. Erfreulicherweise bietet die Gupta-IDE genau dafür eine Lösung: Man kann ein weiteres COM-Objekt erzeugen, die gewünschten Datenelemente als Propertys definieren und es dann als Funktionsparameter in einer COM-Funktion verwenden.

Propertys in COM-Objekten

Über den COM-Wizard (Component / Wizards / COM Class) erstellt man eine CoClass – im Beispiel mit dem Namen “ComplexParameter”

ComComplexParameters01_Wizard01

Im nächsten Schritt werden die Properties hinzugefügt – hier jeweils eines für die Datentypen String, DateTime und Number. Im Beispiel habe ich mich in der Sektion „Declaration“ jeweils für „Set/Get“ entschieden. Was es damit auf sich hat sieht man Programmcode den der Wizard am Ende erzeugt.

ComComplexParameters02_Wizard02_Properties

Der vom Wizard erzeugte Programmcode ist bemerkenswert: Für jedes Property hat er eine Instancevariable m_PropertyName sowie zwei Funktionen PropSetPropertyName und PropGetPropertyName erstellt.

ComComplexParameters03_WizardGeneratedCode

Bindet man das COM-Objekt z.B in ein Visual Studio-Projekt ein, tauchen die Properties wieder so auf, wie gedacht: Als ganz normale Membervariablen des Objekts. Die „PropSet/PropGet“-Funktionen sieht man nicht. Sie werden automatisch als „Setter“ bzw. „Getter“ identifiziert und vom .NET-Framework als solche verwendet. Sie werden implizit bei Wertzuweisungen bzw. beim Abrufen des Property-Werts gerufen.

Infos zum Konzept der Getter und Setter z.B. in der MSDN-Library http://msdn.microsoft.com/en-us/library/aa287786(v=vs.71).aspx

ComComplexParameters04_NetObjectCatalog

Beispielfunktionen

Um das Beispiel zu komplettieren, erstelle ich noch eine COM-Service-Klasse mit zwei Funktionen, die das oben erzeugte COM-Datenobjekt als Parameter verwendet. In der Funktion GetSampleComplexParameter(..) wird das COM-Datenobjekt als Returnwert verwendet, in der Funktion SaveComplexParameter(..) wird er als Funktionsparameter übergeben. Zu beachten ist folgende Regel, die meines Wissens nirgends dokumentiert, aber entscheidend für das Funktionieren des COM-Objeks ist: Verwendet man ein COM-Objekt als Returnwert oder Parameter, muss in der Funktionsdeklaration das Interface verwendet werden, also die COM-Klasse, die mit dem „I“ eingeleitet wird. Arbeiten muss man aber mit der CoClass – also als „Local Variable“ oder „Static Variable“ muss die COM-Klasse ohne das führende „I“ verwendet werden. Deutlich wird das im Programmcode der Funktion „GetSampleComplexParameter“: Der Returnwert ist vom Typ IComplexParameter – die lokale Variable, die zurückgegeben wird ist vom korrespondierenden Typ ComplexParameter. Beachtet man diese Regel nicht, erhält man beim Verwenden des COM-Objekts Fehler.

ComComplexParameters05_ServiceClass

WinForm-Applikation

Um die Funktionalität demonstrieren zu können, habe ich noch eine WinForm-Applikation namens „UsingComComplexParameters“ in C# geschrieben, die das Gupta-COM-Objekt einbindet und deren beiden Service-Funktionen aufruft:

ComComplexParameters06_WinFormSample

Downloads

Die Zip-Datei ComComplexParameters.zip enhält das vollständige Demo inklusive Quelldateien:

  • Das Gupta-Projekt „ComComplexParameter“,
  • die WinForm-Applikation „UsingComComplexParameter“
  • sowie eine lauffähige Demo „WorkingDemo“ mit einer Batch „InstallAndRunComComplexParameterDemo.bat“, die das COM-Objekt registriert, die WinForm-App aufruft und anschließend wieder aufräumt.

ComComplexParameters07_Download

Happy coding.

Advertisements

Über thomasuttendorfer
Ich bin Entwicklungsleiter bei der Softwarefirma [ frevel & fey ] in München. Wir entwickeln Business-Software für Verlage und verwenden dafür den Gupta Team-Developer sowie Visual Studio.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: