Entwickler-Ecke

Dateizugriff - Record mit komplexen Daten als Parameter an DLL übergeben


RedArcus - Fr 05.04.19 14:04
Titel: Record mit komplexen Daten als Parameter an DLL übergeben
Guten Tag,

habe zu diesem Thema schon einiges gelesen und schon Erfahrungen beim Erstellen von DLLs in Delphi. Die meisten Beiträge beziehen sich jedoch auf DLLs die auch von Programmen, die in anderen Sprachen geschrieben wurden, genutzt werden.

Die DLL an der gerade arbeite:
- Wird NUR von Programmen, die in der GLEICHEN Version von Delphi kompiliert wurden, angesprochen.
- Die Daten in dem Record werden in der DLL NUR GELESEN, nie verändert.


Ich übergebe an eine DLL einen Zeiger auf einen Record, der so aussieht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Unit xy
  Type
    PMF_Data = ^TMainFormData;
    // Record mit den Informationen zum Hauptfenster
    TMainFormData = Record
      _Icon:        TIcon;
      _Caption:     TCaption;
      _Rect:        TRect;
      _Handle:      THandle;
      _WindowState: TWindowState;
    end;

Die Übergabe erfolgt so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Function Lade_DLL(Const xMF_Data: TMainFormData): Boolean;
Type
  TDLLFunction = Function(Const xMF_DataZeiger: PMF_Data): Boolean;

Var
  DLLFunction:  TDLLFunction;
.
.
  Result := DLLFunction(@xMF_Data);

In der DLL sieht das so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Uses
  xy;

Function Start_DLL(Const xMF_DataZeiger: PMF_Data): Boolean; Export;
Var
  MyMF_Date: TMainFormData;

begin
  If xMF_DataZeiger <> nil then begin
    MyMF_Data := xMF_DataZeiger^;
end;

Die Übergabe scheint problemlos zu funktionieren. In der DLL komme ich an alle Daten des Records ran.

Ich kann die DLL problemlos entladen und das aufrufende Programm problemlos beenden. MemoryLeaks werden mir auch keine gemeldet.

Meine Frage, kann diese Übergabe trotzdem zu Problemen führen?

Vielen Dank für eure Hilfe.

Mit freundlichem Gruß
Hans

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - So 07.04.19 07:05

Das funktioniert schon so, aber wesentlich einfacher ist, wenn einfach mit Interfaces gearbeitet wird. Wenn man dann eine Erweiterung macht, kann man in der DLL auch mit Supports abfragen, ob ein Erweiterungsinterface unterstützt wird usw.

Zudem bleibt das Interface bestehen solange es in der DLL benutzt wird. Man muss also nicht wie bei der Pointerlösung aufpassen, dass der Record im Hostprogramm bestehen bleibt, wenn die DLL den Pointer z.B. auch mal zwischenspeichern möchte.


RedArcus - Mo 08.04.19 08:21

Vielen Dank für die Antwort,

werde mal über Interfaces nachdenken.