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!