Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-07-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Evitar cerrar formulario principal si hay librerías cargadas dinámicamente

Tengo un formulario contenedor (MDI) en el cuál cargo una librería externa de la siguiente manera:

Código Delphi [-]
TCrear = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;
......
Procedure TMain.Cargar.....
var
   DllHandle: THandle;
   ProcAddr: FarProc;
   CrearForma: TCrear;
....
   DllHandle := LoadLibrary(PAnsiChar('UnArchivo.Dll'));
   ProcAddr := GetProcAddress(DllHandle, 'CrearForma');
   if ProcAddr <> nil then begin
      CrearForma := ProcAddr;
      CrearForma(Application,Self);
   end;
....
En el archivo .dll tengo lo siguiente:
Código Delphi [-]
procedure CrearForma(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
begin
   Application:=ParentApplication;
    with TForm1.Create(Application) as TCustomForm do begin
      MyParentForm:=ParentForm;
      MyParentApplication:=Application;
      FormStyle := fsMDIChild;
      Show;
    end;
end;

exports
   CrearForma;

Con esto puedo cargar el DLL sin ningún problema y me lo muestra como hijo (MDIChild) de mi formulario principal (MDI).

Pero en mi formulario principal (MDI), la variable MDIChildCount siempre me da 0. Aún y cuando yo veo que está el formulario de la DLL creado como hijo (Mdichild).

¿cómo puedo hacer que mi DLL se considere en el formulario principal?
Es decir, ¿como puedo hacer que MDIChilCount realmente me cuente mi
DLL?

Lo que al final quiero lograr, es evitar que se cierre el formulario principal (MDI) si existen DLL cargadas:
Código Delphi [-]
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if MDIChildCount <> 0 then begin
   showmessage('No cierras');
   CanClose := False;
  end;
end;

Y aprovechando, ¿como puedo hacer para cargar una DLL solo una vez?


P.D. Se me olvidó cuál era la correcta definición de una DLL: ¿librería o biblioteca?
__________________


Última edición por ContraVeneno fecha: 01-07-2008 a las 22:06:04.
Responder Con Cita
  #2  
Antiguo 01-07-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
MAIN;

Código Delphi [-]
//...
 
var Count: PCardinal;
 
procedure TMain.FormCreate(Sender: TObject);
begin
 Count := MapViewOfFile(CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 4, 'SHARED'), FILE_MAP_READ, 0, 0, 0);
end;
 
//...
 
procedure TMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 CanClose := not LongBool(Count^);
 if not CanClose then
  ShowMessage('No cierras!');
end;
 
//...

DLLs;

Código Delphi [-]
//...
 
var Count: PCardinal;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 Count := MapViewOfFile(OpenFileMapping(FILE_MAP_WRITE, False, 'SHARED'), FILE_MAP_WRITE, 0, 0, 0);
 Inc(Count^);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 Dec(Count^);
end;
 
//...

Básicamente el proceso/aplicación principal crea un espacio de memoria compartida en el que residirá nuestro contador, así mismo las DLLs acceden a dicho contador y lo incrementan en uno cuando el formulario que contiene dicha librería es creado. Al momento de ser destruido el formulario NO es liberada la librería del proceso que la ha cargado anteriormente, sin embargo en este caso tan particular su razón de existir termina y decrementamos el contador en uno.

Obviamente al intentar cerrar el formulario principal revisará si dicho contador esta en 0, en caso contrario significa que algún formulario no ha sido cerrado, y por ende no es "aconsejable" cerrarlo.

Espero te sea de utilidad.

Saludos

Última edición por cHackAll fecha: 01-07-2008 a las 23:13:57. Razón: F7
Responder Con Cita
  #3  
Antiguo 02-07-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Bueno, con respecto al título del hilo;

Código Delphi [-]
//...
 
uses PsAPI;
 
var Count: Cardinal;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 EnumProcessModules(GetCurrentProcess, nil, 0, Count);
end;
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var Last: Cardinal;
begin
 EnumProcessModules(GetCurrentProcess, nil, 0, Last);
 CanClose := not LongBool(Last - Count);
 if not CanClose then
  ShowMessage(IntToStr((Last - Count) div 2) + ' librerias cargadas dinamicamente. USE: FreeLibrary');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 LoadLibrary('3ivx.dll');
end;

PD; pues lo pongo porque me he aburrido un poquito .

Saludos
Responder Con Cita
  #4  
Antiguo 02-07-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Cita:
Empezado por cHackAll Ver Mensaje
Bueno, con respecto al título del hilo;

Código Delphi [-]//... uses PsAPI; ... EnumProcessModules(GetCurrentProcess, nil, 0, Count); end; ....
EnumProcessModules(GetCurrentProcess, nil, 0, Last); CanClose := not LongBool(Last - Count);

Muy interesante propuesta, el problema que tengo es que no se como detectar cuando se ha cerrado un dll. O mas bien, no se en que punto colocar el FreeLibrary.
__________________

Responder Con Cita
  #5  
Antiguo 03-07-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por ContraVeneno Ver Mensaje
Muy interesante propuesta, el problema que tengo es que no se como detectar cuando se ha cerrado un dll. O mas bien, no se en que punto colocar el FreeLibrary.
Y probaste ésta "propuesta" ?
Responder Con Cita
  #6  
Antiguo 03-07-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Cierto, se me olvidó comentar que la primer propuesta que haces, funciona a la perfección.
__________________

Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Evitar cerrar un formulario desde un componente genius Varios 1 23-11-2006 15:55:42
Cerrar dos formularios creados dinamicamente (al mismo tiempo) ctronx Varios 7 02-09-2004 00:19:04
cerrar formularios creados dinamicamente ctronx Varios 5 17-06-2004 18:25:17
evento de cerrar la ventana principal ronson Varios 1 25-02-2004 13:03:06
Debugear Dll cargadas dinámicamente Aldo Varios 2 13-01-2004 09:50:56


La franja horaria es GMT +2. Ahora son las 14:46:10.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi