bruce185 hat folgendes geschrieben : |
Gibt es vieleicht eine möglichkeit record von der DLL Datei zu exportieren und in Delphi Programm dann auszulesen?
|
Delphi erlaubt das nicht (wohl aber C). Aber es gibt die Moeglichkeit, die Adresse eines Records als Funktionsergebnis zurueckzuliefern und auf dieses dann mittels Pointer-Referenz zuzugreifen:
DLL:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TMyRecord = record Feld1: integer; Feld2: double; end; PMyRecord = ^TMyRecord;
var gblMyRecord: TMyRecord;
function GetMyRecAddr: PMyRecord; export; begin Result := @gblMyRecord; end; |
Programm:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TMyRecord = record Feld1: integer; Feld2: double; end; PMyRecord = ^TMyRecord;
var MyRec: PMyRecord;
begin MyRec := GetMyRecAddr; MyRec^.Feld1 := 0; end; |
Aber das geht nur unter folgenden Voraussetzungen:
1. Die Record-Deklaration muss in Programm und DLL exact uebereinstimmen, incl. des Alignments. Ich wuerde vorsichtshalber als erstes Feld die Laenge des Records als Integer abspeichern, dieses Feld in der DLL mit Sizeof(gblMyRecord) initialisieren und im Programm auf Sizeof(TMyRecord) ueberpruefen, dann schliesst Du schonmal die groebsten Schnitzer aus.
2. Das Record darf keine dynamischen Felder (Strings, dyn. Arrays, Objekte, Interfaces) enthalten. Sicher sind Integer, single, double und extended, boolean, enums (gleiche Deklaration vorausgesetzt).
3. Das Record muss in der DLL entweder wie oben als globale Variable deklariert sein, oder aber auf dem Heap alloziert werden. In letzterem Fall muss Du darauf achten, dass es in der DLL nicht freigegeben wird, solange es im Programm verwendet wird.
Und selbst wenn Du all das beachtest, wirst Du vermutlich weitere Probleme damit haben, auf die ich im Moment gerade nicht komme. ;-)
In der Regel macht man es aber umgekehrt: Das Programm alloziert einen Record und uebergibt ihn per Prozeduraufruf an die DLL, welche ihn dann zur Kommunikation mit dem Programm verwendet. Das Programm ist dann auch fuer die Freigabe des Speichers zustaendig. Auch hier gelten o.g. Einschraenkungen.
twm