[Lazarus-es] Convenciones de librerías

Giuseppe Luigi Punzi glpunzi en lordzealon.com
Dom Abr 10 01:56:17 CEST 2011


El 09/04/2011 20:09, José Mejuto escribió:
> Hello Giuseppe,
>
> Saturday, April 9, 2011, 4:13:25 PM, you wrote:
>
> GLP>  Veamos, me he creado una pequeña librería, que contiene el siguiente código.
> GLP>  library pruebalibreria;
> GLP>  {$mode objfpc}{$H+}
> GLP>  uses
> GLP>     Classes
> GLP>     { you can add units after this }, Dialogs, Interfaces;
> GLP>  {$R *.res}
> GLP>  procedure pruebaMensaje (mensaje : string); stdcall;
> GLP>  begin
> GLP>     ShowMessage(mensaje) ;
> GLP>  end;
> GLP>  begin
> GLP>  end.
>
> Has creado una librería LCL, esto suele ser un problema ya que la LCL
> no suele funcionar bien en librerías, vamos que lo de mostrar forms en
> una librería y cosas así, no suele funcionar correctamente (quizá en
> Windows si).

¿Entonces no podría mostrar un mensaje desde la DLL?

> GLP>  Compila bien y tengo mi "pruebaLibreria.dll" y ahora quiero llamarla
> GLP>  desde otro sitio. En el entorno donde trabajo, a la hora de crear las
> GLP>  DLL's y sus funciones, me pide la convención de éstas, y tengo las
> GLP>  siguientes opciones.
> GLP>  http://img853.imageshack.us/i/convencionesdll.jpg/
>
> Para 32 bits usa "StdCall" o bien "CDecl", el resto pueden presentar
> problemas serios de compatibilidad. Si la librería es para Windows
> "StdCall" es la que usa el API de Windows, si la librería es para
> Linux lo habitual es usar "CDecl" (convención de "C").

CDecl quizás sea lo más adecuado.

> GLP>  Mi aplicación no muestra el mensaje al hacer la llamada, y puede que el
> GLP>  error no esté en la DLL, si no en como la llamo desde mi aplicación,
> GLP>  pero antes de pegarme con éso, me gustaría saber si el error puede venir
> GLP>  por el tema de las convenciones, y no sé, cuál es la convención que saca
> GLP>  por defecto Lazarus/Freepascal.
>
> Por defecto se usa "FastCall" y además no has exportado las funciones:
>
> GLP>  begin
> GLP>  end.
>       exports
>         pruebaMensaje;
>

Sí, buscando dí con un tutorial de Delphi, y después lo añadí, y me dí 
cuenta que mi aplicación se caía al llamar a la DLL, me hice un pequeño 
proyectillo[1] para comprobar el funcionamiento de la librería, pero la 
aplicación se queda colgada, quizás es por lo que comentas de la LCL.

> Una vez generada la DLL comprueba con un visor de exportaciones si el
> nombre de la función está disponible en "Exports". Yo uso el viejo
> TDump, pero supongo que con tu compilador (Visual C parece) vendrá
> algo más moderno.
No es VisualC. Es un entorno visual cerrado llamado Velneo.

[1]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, 
StdCtrls;

type

   { TForm1 }

   TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
   private
     { private declarations }
   public
     { public declarations }
   end;

var
   Form1: TForm1;

procedure pruebaMensaje (mensaje : string); stdcall external 
'pruebaLibreria.dll';

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
   pruebaMensaje('Test');
end;

end.





More information about the Lazarus-es mailing list