Autor Beitrag
RedArcus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Fr 05.04.19 15:04 
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:
ausblenden 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18724
Erhaltene Danke: 1627

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 07.04.19 08: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Mo 08.04.19 09:21 
Vielen Dank für die Antwort,

werde mal über Interfaces nachdenken.