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