[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