delphi exe y dll sin compilación con paquetes de tiempo de ejecución
runtime frame (1)
Demasiado. Ese código no funcionará sin paquetes de tiempo de ejecución. (Y con los paquetes de tiempo de ejecución, debe usar LoadPackage
lugar de LoadLibrary
).
Sin paquetes, cada módulo de su programa (el EXE y cada DLL) tiene su propia copia de la definición de todas las clases estándar, incluidos TFrame
, TWinControl
e incluso TObject
. Una clase TWinControl
del EXE no se ve como un TWinControl
a la DLL.
Como está compartiendo clases entre módulos, debe asegurarse de que todos tengan las mismas definiciones de esas clases, y los paquetes de tiempo de ejecución son la forma de hacerlo.
Si realmente no va a usar paquetes en tiempo de ejecución, entonces necesita cambiar la interfaz de su DLL para que no comparta ningún tipo de objeto Delphi. En lugar del padre TWinControl
, pase la propiedad Handle
del control o cualquier otro valor HWnd
para servir como la ventana principal. El código DLL no podrá asumir que ya existe un objeto Delphi para el padre, y el EXE no podrá asumir que el control que recibe es un objeto Delphi; estarán restringidos a usar la API de Windows para manipular identificadores de ventanas y enviar mensajes.
Para mi último proyecto estaba usando muchos marcos en mi aplicación delphi, así que decidí crear dlls y ponerlos dentro de los dlls (TODO creado en Delphi)
He revisado muchos sitios web y se me ocurrió el código que funciona, pero para ese ejemplo tengo que compilar aplicaciones y dlls con compilación con paquetes de tiempo de ejecución, lo que significa que también tengo que distribuir los bpls. y si no se comprueba construir con paquetes de tiempo de ejecución, el error viene
este es el código que encontré
en exe
procedure TForm1.Button1Click(Sender: TObject);
type
TGetTheFrame =Function( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall ;
var
GetTheFrame : TGetTheFrame;
begin
try
GetTheFrame(application,TabSheet1).Free ;
except
end;
frm := GetTheFrame(application,TabSheet1) ;
dllHandle := LoadLibrary(''project1.dll'') ;
if dllHandle <> 0 then
begin
GetTheFrame := GetProcAddress(dllHandle, ''GetTheFrame'') ;
frm := GetTheFrame(application,TabSheet1) //call the function
{ ShowMessage(''error function not found'') ;
FreeLibrary(dllHandle) ; }
end
else
begin
ShowMessage(''xxxx.dll not found / not loaded'') ;
end
en dll
Function GetTheFrame( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall;
Begin
Result := TFrame2.Create( Owner );
Result.Parent := TheParent;
End;
eso es todo, pero quiero que este código funcione sin paquetes de tiempo de ejecución