Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Event beim Entladen einer DLL? (https://www.delphipraxis.net/193262-event-beim-entladen-einer-dll.html)

sko1 10. Jul 2017 09:04

Delphi-Version: 5

Event beim Entladen einer DLL?
 
Hallo,

in einer DLL werden einige TStringList beim Abarbeiten von DLL-Funktionen global erzeugt (z.B. ein Errorlog) welches dann nach Abarbeitung ausgelesen werden soll.

ReportMemoryLeaksOnShutdown bemeckert eben genau diese TStringLists nur fehlt mir irgendwie der Ansatz, wie ich diese wieder zerstören kann?

Die DLL wird statisch geladen, mehrere Funktionen daraus aufgerufen, dann ggf. das Errorlog gelesen und dann das Programm beendet.

Ciao
Stefan

TiGü 10. Jul 2017 09:35

AW: Event beim Entladen einer DLL?
 
Wie werden die denn global erzeugt?
In einen initialization-Abschnitt?
Hast du probiert, diese in einen finalization-Abschnitt freizugeben?

sko1 10. Jul 2017 09:39

AW: Event beim Entladen einer DLL?
 
Nein, die Erzeugung passiert momentan im DLL-Procedure-Aufruf ala

Delphi-Quellcode:
 
 if ErrorLog = Nil then
    ErrorLog := TStringList.Create
  else
    ErrorLog.Clear;
danke für den Tip mit dem initialization-Abschnitt, aber wie geht das in einer DLL?

Ciao
Stefan

TiGü 10. Jul 2017 10:40

AW: Event beim Entladen einer DLL?
 
Zitat:

Zitat von sko1 (Beitrag 1376339)
danke für den Tip mit dem initialization-Abschnitt, aber wie geht das in einer DLL?

Genauso wie in einer normalen Anwendung.

himitsu 10. Jul 2017 10:49

AW: Event beim Entladen einer DLL?
 
Initialize und Finalize der Units funktionieren sowohl in EXE , als auch DLL.
Ebenso Class-Contructor und Class-Destructor.

BEGIN in der DPR (EXE/DLL) entspricht der InitProc/DLLMain, also in etwa dem letzten Initialize (nach allen Units)
Es gibt auch noch eine ExitProc, aber die ist in Delphi nicht so schön nutzbar. (Delphi-Referenz durchsuchenSystem.ExitProc)

Zacherl 10. Jul 2017 12:02

AW: Event beim Entladen einer DLL?
 
Alternativ kann man auch noch die
Delphi-Quellcode:
DllMain
austauschen:
Delphi-Quellcode:
var
  DLLProcNext: procedure(Reason: Integer);

procedure DLLMain(Reason: Integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH: ;
    DLL_THREAD_ATTACH : ;
    DLL_THREAD_DETACH : ;
    DLL_PROCESS_DETACH: ;
  end;
  if Assigned(DLLProcNext) then DLLProcNext(Reason);
end;

begin
  DLLProcNext := TInterlocked.Exchange(@DLLProc, @DLLMain);
  DLLMain(DLL_PROCESS_ATTACH);
end.
In deinem Falle sollte
Delphi-Quellcode:
finalization
aber ausreichend sein.

sko1 10. Jul 2017 12:23

AW: Event beim Entladen einer DLL?
 
Danke für all die Hinweise, jetzt tut die DLL was sie soll (zumindest fast) denn ich bekomme immer noch ein kleines Memoryleak:

21 - 28 bytes : TMBSEncoding x 1

Wo zum Teufel kommt das her?

Ciao
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 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