Ver Mensaje Individual
  #3  
Antiguo 11-07-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 22
andres1569 Va por buen camino
Bueno, te diré lo que entendí:

Tienes encapsulados en una DLL varios formularios, para poderlos cargar dinámicamente desde otro programa ¿es esto correcto?

Básicamente debes tener definida en el proyecto dll1 (la .DLL) una función al menos por cada formulario que quieras lanzar, de forma que la aplicación externa llame a esa función simplemente. Dicha función (o procedure, da igual) deberá tener un parámetro AHandle del tipo THandle, para que la aplicación Host le pase en dicho parámetro Handle del Form principal, es decir Application.Handle; de esta forma los formularios llamados se comportarán como hijos de tu programa (eso sí, claro, cuando los crees en la DLL haz esto Form1 := TForm1.Create (AHandle) ).

Por lo demás, supongo que sabes las convenciones de llamada para este tipo de funciones, y cómo debes llamarlas, aquí te pongo un ejemplito :
Código:
function TDATAMAIN.IniciaAsistenteConexion (NumCon: Smallint) : Boolean;
var
  LibHandle : THandle;
  CWizard : TShowConnectWizard;
begin
  result := FALSE;
  LibHandle := LoadLibrary(NomDLLDialogos);
  try
    if LibHandle = 0 then 
      raise EDLLLoadError.Create('No se pudo cargar la DLL');
    @CWizard := GetProcAddress(LibHandle, 'ShowConnectWizard');
    result := (@CWizard <> nil);
    if result then
      result := CWizard (Application.Handle, TRUE, NumCon, DirAplicacion,
                         NomArchivoIni, SolicitaCerrarSesion)
    else RaiseLastWin32Error;
  finally
    FreeLibrary(LibHandle);
  end;
end;
De esta rutina quédate básicamente con la llamada a LoadLibrary que coloca en LibHandle una referencia a la DLL, si esta se halló (el nombre de la DLL es NomDLLDialogos en este caso).

TShowConnectWizard en este caso es un tipo de función que concuerda con una función implementada en la DLL, en esta rutina lo que se hace es colocar en la variable CWizard una referencia a dicha función de la DLL (GetProcessAddress), si es que se encuentra. Esto es una forma dinámica de hacer las cosas, normalmente se sabe de antemano el nombre de la función y se fija por código al compilar (fíjate en la unit Windows que viene con Delphi, ahí se declaran muchas funciones que son referencias a funciones en DLLs de Windows y coinciden hasta con el mismo nombre).

Finalmente, si se encontró la función deseada, se la llama, pasándole como primer parámetro el Application.Handle que te comenté más arriba.

Si quieres hacer pruebas de la DLL, teniendo el proyecto Dll1 activo en el IDE de Delphi, vas al menú Run - Parameters y ahí le indicas cuál es la aplicación host (tu otro proyecto compilado).

Espero que ahora lo tengas más claro, no sea que te lo haya complicado más aún.

Saludos
__________________
Guía de Estilo
Responder Con Cita