Ver Mensaje Individual
  #1  
Antiguo 22-07-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Reputación: 24
ContraVeneno Va por buen camino
Cerrar Paquetes cargados dinámicamente, desde el paquete.

Estoy cargando dinámicamente un paquete BPL desde un ejecutable (Aplicación MDI) de la siguiente forma:
Código Delphi [-]
   PackageModule := LoadPackage('UnBPL.bpl');
   if PackageModule <> 0 then begin
    AClass := GetClass('TClaseBPL');
    if AClass <> nil then begin
     with TComponentClass(AClass).Create(Application) as TForm do begin
      OnClose := LiberaBPL;
      Tag := PackageModule;
      Show;
      //Free
     end; //with
    end else begin
      showmessage('no se pudo');
    end; //if aclass
//   UnloadPackage(PackageModule);
   end; //if package <>0

El detalle está en que le asigno al evento OnClose, le asigno la función "LiberaBPL", la cuál lo único que hace es liberar el paquete de la siguiente forma:
Código Delphi [-]
  Temp := (sender as TForm).Tag;
  (sender as TForm).Free;
  UnloadPackage(Temp);

Si le doy click al botón cerrar de la barra de título (la tachita roja), se ejecuta el evento OnClose desde la aplicación que lo carga (MDI) y se libera el paquete si problemas:
Es decir: MDI -> OnClose -> LiberarBPL -> Regresa al MDI

Pero si dentro del BPL pongo un botón "Cerrar" con la instrucción "Close", el evento OnClose se manda llamar desde el mismo BPL y me genera un error de memoría, porque pasada la línea "UnloadPackage", intenta regresar al BPL, pero este ya fue liberado;
Es decir: BPL -> OnClose -> LiberarBPL -> Regresa al BPL - Error de memoria

Puedo hacer, en lugar de la instrucción "Close", poner la instrucción "Free" y el BPL se libera, pero no se libera en la aplicación MDI (nunca ejecuta el OnClose -> LiberarBPL).

Así que mi pregunta es: ¿Como puedo cerrar y liberar el paquete, desde el mismo paquete? Cualquier idea, orientación o comentario es bienvenido.
__________________

Responder Con Cita