Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Record über COM-Schnittstelle übergeben (https://www.delphipraxis.net/201127-record-ueber-com-schnittstelle-uebergeben.html)

Johannes G. 25. Jun 2019 15:26

Record über COM-Schnittstelle übergeben
 
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

peterbelow 25. Jun 2019 17:10

AW: Record über COM-Schnittstelle übergeben
 
Zitat:

Zitat von Johannes G. (Beitrag 1435314)
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.

hoika 25. Jun 2019 18:40

AW: Record über COM-Schnittstelle übergeben
 
Hallo,
schau mal hier, viell. hilft dir das.

http://www.delphigroups.info/2/7/743670.html

Johannes G. 26. Jun 2019 07:07

AW: Record über COM-Schnittstelle übergeben
 
Vielen Dank für euere Hilfe!
Ich habe es mit OleVariant Lösung realisiert.

Funktionen für die Typenumwandlung habe ich hier gefunden:

http://www.delphigroups.info/2/72/273626.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz