[Lazarus-es] Convenciones de librerías

José Mejuto joshyfun en gmail.com
Sab Abr 9 20:09:18 CEST 2011


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é





More information about the Lazarus-es mailing list