Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Record über COM-Schnittstelle übergeben

  Alt 25. Jun 2019, 17:10
Hallo,

Ich habe ein Berechnungsprogramm via ActiveX-Komponente zu einem Server gemacht. Mit einem Client-Programm kann ich den "Berechnungsserver" aufrufen und berechnungen starten- funktioniert soweit alles tadellos.
Allerdings habe ich bis zu 50 Berechnungsoptionen, die man über den Client auswählen kann. Somit müsste ich 50 Parameter dem Server übergeben...
Mein Gedanke wäre die Berechnungsoptionen in einen Record zu packen und dem Server zu senden. Allerdings bin ich bei der COM-Schnittstelle an die Standardtypen gebunden. Ist es möglich den Record in einen Standardtyp z.B. OleVariant umzuwandeln und beim Server wieder zurück in Record?
Oder kann hier irgenwie mit Pointern gearbeitet werden?

Ich bin absoluter Neuling in der Schnittstellenprogrammierung und komme hier nicht mehr weiter. Habe auch nichts im Netz gefunden das mir weitergeholfen hat. Vielleicht könnt ihr mir einen Denkanstoß oder Hinweis geben.


Gruß
Johannes
Es ist zwar nicht unmöglich, eine Art record per COM/OLE zu übergeben, aber es ist komplex, weil das Ganze ursprünglich für VB user-defined types konzipiert wurde und Delphi da, soweit ich mich entsinne, keinen äquivalenten Support bietet. Was aber ziemlich einfach ist, ist ein weiteres COM-Objekt mit einem entsprechenden Interface zum Server hinzuzufügen, das einfach für jedes Feld des Records entsprechende Setter und Getter-Methoden anbietet, unter Verwendung OLE-kompatibler Datentypen. Das kann von jedem COM Client verwendet werden.

Das hört sich schlimmer an als es ist, mit ein Bißchen regular expression search und replace kann man das Interface so halbautomatisch aus der Recorddeklaration erzeugen.

Wenn Du sowohl Client als auch Server kontrollierst kannst Du natürlich auch einfach den Record 1:1 in einen variant array of byte kopieren, diesen Variant als Parameter übergeben und den Record "auf der anderen Seite" wieder aus dem array extrahieren. Dafür müssen beide Seiten den Record-Typ kennen, und der Record darf nur value-typen enthalten, keine reference-typen wie String oder dynamische arrays.
Peter Below
  Mit Zitat antworten Zitat