Ich habe einen kleinen schweren Ausnahmefehler.
Ich versuche einen Programmteil der wenig gebraucht wird automatisch zuzuladen und wieder zu entfernen. Dazu verwende ich Packages.
Beim Freigeben kommte es zu einer Fehlermeldung, die ich darauf zurückführe das ich Code-Ausführe den es durch UnloadPackage nicht mehr gibt. Wie kann ich nun das
Package von sich selbst aus entladen?
Delphi-Quellcode:
var hPack : Cardinal;
// zum Laden
sClsName :
String;
proc : TAppClassName;
// zum Entladen
mbi : TMemoryBasicInformation;
I : Integer;
fCls : TComponent;
begin
if IsRunning
then
// --------- Stopp --------
if VirtualQuery(Pointer(fRun.ClassType), mbi, SizeOf(mbi)) > 0
then
begin
hPack := Cardinal(mbi.AllocationBase);
//
(fRun
as IAddInPre).PreDone;
// Alle Componenten Freigeben
for I := Application.ComponentCount - 1
downto 0
do
begin
fCls := Application.Components[I];
if (VirtualQuery(Pointer(fCls.ClassType), mbi, SizeOf(mbi)) > 0)
and
(Cardinal(mbi.AllocationBase) = hPack)
then
fCls.Free;
end;
// AppCtx freigeben
FreeAndNil(fRun);
// Package entladen
UnloadPackage(hPack);
Owner.fRunApps.Remove(Self);
end
else
MessageDlg('
Package <-> Klassen-Zuordnung schlug fehl!', mtError, [mbOk], 0)
else
begin // --------------- Run -------------
hPack := LoadPackage(sBpl);
if hPack <> 0
then
try
proc := GetProcAddress(hPack, csClassNameFuncApp);
if Assigned(proc)
then
begin
sClsName := proc();
// Erstellen und Eintragen
fRun := TComponentClass(FindClass(sClsName)).Create(fOwner.fModulOwner)
as TPWAppCtx;
with fRun
as IAddInPre
do
begin
SetInfo(Self);
PreInit;
end;
Owner.fRunApps.Add(Self);
end
else
raise Exception.Create('
no classproc');
except
UnloadPackage(hPack);
MessageDlg('
Package konnte nicht initialisiert werden!', mtError, [mbOk], 0);
end
else
MessageDlg('
Package konnte nicht geladen werden!', mtError, [mbOk], 0);
end;
end;