Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   ModuleUnload wozu? (https://www.delphipraxis.net/198637-moduleunload-wozu.html)

TurboMagic 20. Nov 2018 18:01

ModuleUnload wozu?
 
Hallo,

ich versuche das folgende Projekt wieder release fähig zu bekommen:

https://github.com/winkelsdorf/Delph...tionCompendium

Wie man bei genauer Betrachtung sehen kann, bin ich damit schon ein gutes Stück weit gekommen.
Nun bin ich aber über etwas gestolpert, was ich nicht verstehe und damit nicht weiß wie ich damit umgehen soll.

Es gibt in dieser Bibliothek eine Wurzeloklasse, von der alle Verschlüsselungs-, Hash- und Formatierungsklassen abgeleitet sind.
Außerdem gab es einen Registrierungsmechanismus, mittels dem alle Klassen als Klassenreferenz inj einer TList verfügbar waren.
Ein schlauer Ansatz für manche Dinge. Nur will ich von der TList weg usw. und habe daher diesen mechanismus umgestellt und
aufgeteilt.

Dabei bin ich auf dieses Konstrukt in der Unit gestoßen, welche die Basisklasse und die Listenklasse enthält:

Delphi-Quellcode:
{$IFDEF DELPHIORBCB}
procedure ModuleUnload(Instance: NativeInt);
var // automaticaly deregistration/releasing
  i: Integer;
begin
  if FClasses <> nil then
  begin
    for i := FClasses.Count - 1 downto 0 do
    begin
      if Integer(FindClassHInstance(TClass(FClasses[i]))) = Instance then
        FClasses.Delete(i);
    end;
  end;
end;
{$ENDIF DELPHIORBCB}

initialization
  {$IFDEF DELPHIORBCB}
  AddModuleUnloadProc(ModuleUnload);
  {$ENDIF DELPHIORBCB}
  FClasses := TList.Create;

finalization
  {$IFDEF DELPHIORBCB}
  RemoveModuleUnloadProc(ModuleUnload);
  {$ENDIF DELPHIORBCB}
  FClasses.Free;
end.
FCLasses ist die alte Listenklasse. Und laut Delphi Hilfe ist das mit mdem ModuleUnload ein Callbackmechanismus
der aufgerufen wird, wenn ein Package entladen wird. Mit Packages hab' ich aber bisher noch nicht gearbeitet.

So wie ich den hier umgesetzten Callback verstehe, werden beim Entladen des Packages, welches diese Unit enthält,
alle Klassenreferenzen aus der Registrierungsliste entfernt, deren Instance Handle dem des Packages entspricht.

1. Hab' ich das so richtig verstanden?
2. Was ist ein Instance Handle? Ich kenne bisher Datei- und DLL-Handles...?
3. Warum hat eine Klasse eines, oder doch nicht?
3. Wozu muss man das tun? Wären dann nicht alle registrierten Klassen der Liste zu entfernen, weil alle dieses
handle haben müssten? (es sei den man würde die Instanz der Liste jemandem außerhalb des Packages geben und
der würde sich über den Listenregistrierungsmechanismus auch registrieren)

Kann mir das mal bitte jemand erklären?
Benutztes Delphi ist in dem Projekt noch 10.1 Berlin.

Grüße

TurboMagic

PS: freiwillige Helfer für die Entwicklung dieser Bibliothek sind gerne willkommen! ;-)

dummzeuch 20. Nov 2018 18:48

AW: ModuleUnload wozu?
 
Zitat:

Zitat von TurboMagic (Beitrag 1418558)
So wie ich den hier umgesetzten Callback verstehe, werden beim Entladen des Packages, welches diese Unit enthält,
alle Klassenreferenzen aus der Registrierungsliste entfernt, deren Instance Handle dem des Packages entspricht.

1. Hab' ich das so richtig verstanden?
2. Was ist ein Instance Handle? Ich kenne bisher Datei- und DLL-Handles...?
3. Warum hat eine Klasse eines, oder doch nicht?
3. Wozu muss man das tun? Wären dann nicht alle registrierten Klassen der Liste zu entfernen, weil alle dieses
handle haben müssten? (es sei den man würde die Instanz der Liste jemandem außerhalb des Packages geben und
der würde sich über den Listenregistrierungsmechanismus auch registrieren)

Kann mir das mal bitte jemand erklären?
Benutztes Delphi ist in dem Projekt noch 10.1 Berlin.

zu 1: Soweit ich das verstehe, hast du Recht: Beim Entladen es Packages werden alle Klassen, die es zur Verfügung stellt, de-registriert, damit sie nicht aus Versehen instantiiert werden, was dann z.B. zu Access Violations führen könnte.

zu 2: Da Packages nur glorifizierte DLLs sind, ist das Instance Handle dasselbe, was Du schon kennst.

zu 3: Es ist nicht die Klasse, die es hat, sondern das Package, in dem sie deklariert - registriert wird.

zu 4: Das System ist vermutlich darauf ausgerichtet, durch weitere Klassen in zusätzlichen Packages dynamisch erweitert zu werden (oder es gibt bereits schon mehrere Packages?).

twm

TurboMagic 20. Nov 2018 18:53

AW: ModuleUnload wozu?
 
Danke schon mal für diese Antworten.

Was ich noch nicht verstehe ist das hier: FindClassHInstance.
Findet das heraus in welchem package/DLL eine Klasse deklariert ist?

Zacherl 20. Nov 2018 19:44

AW: ModuleUnload wozu?
 
Zitat:

Zitat von TurboMagic (Beitrag 1418562)
Was ich noch nicht verstehe ist das hier: FindClassHInstance.

Da kann ich grade nichts zu sagen, aber der Cast nach
Delphi-Quellcode:
Integer
ist problematisch unter 64-Bit.
Delphi-Quellcode:
Instance
ist dann nämlich ebenfalls 64-bit, dein Ergebnis von
Delphi-Quellcode:
FindClassHInstance
wird allerdings auf 32-bit truncated.

TurboMagic 20. Nov 2018 20:41

AW: ModuleUnload wozu?
 
Danke für den Tipp mit dem Integer. Momentan ist es auskommentiert, weil ich's ja noch nicht verstanden hatte.


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