Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Entladen eines Packages (https://www.delphipraxis.net/19506-entladen-eines-packages.html)

neolithos 4. Apr 2004 19:03


Entladen eines Packages
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz