Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2011-04

Convenciones de librerías

6 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Giuseppe Luigi Punzi

Hola a todos, debido a que el Wiki de Lazarus no funciona, no puedo consultar estos temas sobre DLLs en ella, por lo que recurro a vosotros.

Veamos, me he creado una peque�a librer�a, que contiene el siguiente c�digo.

library pruebalibreria;
{$mode objfpc}{$H+}

uses
Classes

   { you can add units after this }, Dialogs, Interfaces;
{$R *.res}
procedure pruebaMensaje (mensaje : string); stdcall;
begin
   ShowMessage(mensaje) ;
end;
begin
end.

Compila bien y tengo mi "pruebaLibreria.dll" y ahora quiero llamarla desde otro sitio. En el entorno donde trabajo, a la hora de crear las DLL's y sus funciones, me pide la convenci�n de �stas, y tengo las siguientes opciones.

http://img853.imageshack.us/i/convencionesdll.jpg/

Y en la declaraci�n de las funciones, he declarado: http://img59.imageshack.us/i/funciondll.jpg/

Mi aplicaci�n no muestra el mensaje al hacer la llamada, y puede que el error no est� en la DLL, si no en como la llamo desde mi aplicaci�n, pero antes de pegarme con �so, me gustar�a saber si el error puede venir por el tema de las convenciones, y no s�, cu�l es la convenci�n que saca por defecto Lazarus/Freepascal.

Es la primera vez que programo librer�as, por lo que estoy muy pez en este tema, y no s� cual debo elegir.

Muchas gracias.

Reply by email

José Mejuto
to Giuseppe Luigi Punzi

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).

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").

GLP> Y en la declaraci�n de las funciones, he declarado: GLP> http://img59.imageshack.us/i/funciondll.jpg/

C_DEFAULT significa que usar� el que le salga de las narices :) Eso nunca lo uses, por que el "default" de una versi�n del compilador puede no ser el default de otra.

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;

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.

Best regards, Jos�

Reply by email

Giuseppe Luigi Punzi
to José Mejuto

El 09/04/2011 20:09, Jos� Mejuto escribi�:

Show quoted text 22 lines
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?

Show quoted text 10 lines
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.

Show quoted text 13 lines
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.

Reply by email

José Mejuto
to Giuseppe Luigi Punzi

Hello Giuseppe,

you wrote
> 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).

GLP> �Entonces no podr�a mostrar un mensaje desde la DLL?

Un mensaje si, y si es para Windows s�lo siempre te queda usar la WinAPI para cosas sencillas como un MessageBox.

> 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").

GLP> CDecl quiz�s sea lo m�s adecuado.

Si lo vas a usar en 2 o m�s plataformas mejor que todo sea CDecl.

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

Si, te falla por que no inicializas la LCL al hacerlo en una librer�a. Te pongo un poco lo que te falta, pero puede no ser exactamente as�, ya que no he hecho pruebas de librer�a con LCL:

1) Te falta inicializar la LCL, o sea, crear un objeto TApplication, si no no hay cola de mensajes ni nada de nada, vamos por lo menos te falta "Application.Initialize;" antes de llamar a nada que use la LCL.

2) Es posible que antes de abrir un form cualquiera tengas que ejecutar un "Application.Run;" de modo que las colas de mensajes existan, pero como he dicho esto podr�a funcionar en Windows, pero lo dudo en GTK, QT, etc...

Est� claro que hay que pegarle un vistazo a la LCL a ver si se da construido una librer�a que muestre forms, etc, aunque fallen algunas cosas m�s avanzadas.

Por cierto, creo que la directiva external en la funci�n sobra, ya que si no me equivoco eso ser�a para traer esa funci�n de una DLL, no al rev�s, pero como te digo hace a�os que no hago una DLL, la �ltima en Delphi hace como 3 o 4 a�os :)

> 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.

GLP> No es VisualC. Es un entorno visual cerrado llamado Velneo.

Si ya me he fijado ahora que no era VC :)

Best regards, Jos�

Reply by email

Giuseppe Luigi Punzi
to José Mejuto

El 10/04/2011 13:18, Jos� Mejuto escribi�:

Show quoted text 12 lines
Hello Giuseppe, Sunday, April 10, 2011, 1:56:17 AM, you wrote: >> 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). GLP> �Entonces no podr�a mostrar un mensaje desde la DLL? Un mensaje si, y si es para Windows s�lo siempre te queda usar la WinAPI para cosas sencillas como un MessageBox.

Ya investigar�, realmente no necesito que muestre ning�n mensaje, pero era s�lo una prueba.

Show quoted text 7 lines
>> 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"). GLP> CDecl quiz�s sea lo m�s adecuado. Si lo vas a usar en 2 o m�s plataformas mejor que todo sea CDecl.

Si, es el caso. Velneo trabaja desde Win/Linux/Mac y precisamente, la librer�a quiero que sea igualmente portable.

Show quoted text 21 lines
GLP> S�, buscando d� con un tutorial de Delphi, y despu�s lo a�ad�, y me d� GLP> cuenta que mi aplicaci�n se ca�a al llamar a la DLL, me hice un peque�o GLP> proyectillo[1] para comprobar el funcionamiento de la librer�a, pero la GLP> aplicaci�n se queda colgada, quiz�s es por lo que comentas de la LCL. Si, te falla por que no inicializas la LCL al hacerlo en una librer�a. Te pongo un poco lo que te falta, pero puede no ser exactamente as�, ya que no he hecho pruebas de librer�a con LCL: 1) Te falta inicializar la LCL, o sea, crear un objeto TApplication, si no no hay cola de mensajes ni nada de nada, vamos por lo menos te falta "Application.Initialize;" antes de llamar a nada que use la LCL. 2) Es posible que antes de abrir un form cualquiera tengas que ejecutar un "Application.Run;" de modo que las colas de mensajes existan, pero como he dicho esto podr�a funcionar en Windows, pero lo dudo en GTK, QT, etc... Est� claro que hay que pegarle un vistazo a la LCL a ver si se da construido una librer�a que muestre forms, etc, aunque fallen algunas cosas m�s avanzadas.

Sobre �sto ya me calentar� la cabeza llegado el momento, ahora mismo la verdad es que creo que no lo necesito.

Por cierto, creo que la directiva external en la funci�n sobra, ya que si no me equivoco eso ser�a para traer esa funci�n de una DLL, no al rev�s, pero como te digo hace a�os que no hago una DLL, la �ltima en Delphi hace como 3 o 4 a�os :)

Donde est� el external, es el proyecto que he creado de prueba para comprobar si la dll funcionaba.

Reply by email