Einzelnen Beitrag anzeigen

neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#1

Entladen eines Packages

  Alt 4. Apr 2004, 19:03
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;
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat