delphi dll runtime frame bpl

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