[Lazarus-es] Problema con LoadLibrary

Juan M. Puertas soft.sirius en gmail.com
Mar Ene 20 18:09:29 CET 2015


Hola Maxi. La diferencia está en la manera de declarar y llamar a las
funciones. Puedes verlo en los {$IFDEF...
Lo importante es que el último código enviado sirve de ejemplo sobre el
funcionamiento de Loadlibrary para quien lo pueda necesitar. :-)
Saludos.

El 20 de enero de 2015, 17:33, Maxi <maximiliano.duarte en gmail.com> escribió:

> no identifico cual es la solucion
>
> El día 19 de enero de 2015, 18:29, Juan M. Puertas
> <soft.sirius en gmail.com> escribió:
> > Muchas gracias Maxi.Ya lo he resuelto.
> > Como pienso que la solución puede venir bien a alguien, incluso como
> ejemplo
> > del uso de LoadLibrary. Expongo la solución:
> > _______________________________________________________________
> >
> > uses dynlibs;
> > (...)
> >
> >   type
> >     {$IFDEF Windows}
> >     swe_calc   =  function(tjd : double;    {Julian day number}
> >                    ipl         : Integer;   {planet number}
> >                    iflag       : Longint;   {flag bits}
> >                    var xx      : double;    {first of 6 doubles}
> >                    sErr        : PChar      {Error-String}
> >   ): Longint; stdcall;
> >     {$ELSE}
> >     swe_calc   =  function(tjd : double;    {Julian day number}
> >                    ipl         : Integer;   {planet number}
> >                    iflag       : Longint;   {flag bits}
> >                    var xx      : double;    {first of 6 doubles}
> >                    sErr        : PChar      {Error-String}
> >   ): Longint; {stdcall;} cdecl;
> >     {$ENDIF}
> >
> > const
> >   SEFLG_JPLEPH : Longint =        1;       { use JPL ephemeris }
> >   SEFLG_SWIEPH : Longint =       2;       { use SWISSEPH ephemeris }
> >   SEFLG_MOSEPH : Longint =      4;       { use Moshier ephemeris }
> >
> > var
> >   astro_Handle:TLibHandle=dynlibs.NilHandle;
> >   swCalc: swe_calc;
> >   res: longint;
> >   xx : array [0..5] of double;
> >   sErr: array[0..255] of char;
> >   begin
> >   {$IFDEF Windows}
> >     astro_Handle := LoadLibrary('swedll32.dll');
> >     swCalc := swe_calc(GetProcedureAddress(astro_Handle, '_swe_calc en 24
> '));
> >   {$ELSE}
> >     astro_Handle := LoadLibrary('libswe.so');
> >     swCalc := swe_calc(GetProcedureAddress(astro_Handle, 'swe_calc'));
> >   {$ENDIF}
> >   res:= swCalc(tjd,ipl,SEFLG_SWIEPH,xx[0],sErr);
> >   LongiPlanet := xx[0];
> >   (...)
> >   UnloadLibrary(astro_Handle);
> >
> > _______________________________________________________________
> >
> >
> >
> > El 17 de enero de 2015, 15:10, Maxi <maximiliano.duarte en gmail.com>
> escribió:
> >
> >> Seguramente esta intentado liberar o usar memoria que no tiene
> >>
> >> desde el celu
> >>
> >> El ene 17, 2015 8:58 AM, "Juan M. Puertas" <soft.sirius en gmail.com>
> >> escribió:
> >>
> >>> Muchas gracias Maxi. :-)
> >>> Lo he resuelto asignando un valor a err.
> >>> Ahora todo va bien, pero al salir de la función en la que se encuentra
> la
> >>> llamada a la biblioteca en C, (en el end;) me da el error: "El proyecto
> >>> syrius ha lanzado una excepción de la clase 'External: SIGSEGV'."
> >>>
> >>>  ¿Alguien sabe por qué pasa esto?.
> >>>  Gracias.
> >>>
> >>>
> >>>
> >>> El 16 de enero de 2015, 13:27, Maxi <maximiliano.duarte en gmail.com>
> >>> escribió:
> >>>>
> >>>> antes de llamarla debes asegurarte que pudo cargar la libreria,
> >>>> revisando que no esté en nil swCalc .
> >>>> Por otro lado probaste de cargarla estaticamente para ver sino no es
> >>>> un error de tipo de declaracion?
> >>>>
> >>>> El día 15 de enero de 2015, 19:26, Juan M. Puertas
> >>>> <soft.sirius en gmail.com> escribió:
> >>>> > Hola amigos.
> >>>> > Estoy intentando utilizar una biblioteca escrita en C. La
> declaración
> >>>> > que
> >>>> > funciona en Delphi de la función que voy a utilizar es la siguiente:
> >>>> > _________________________________________________________
> >>>> > function swe_calc_Win(
> >>>> >                  tjd    : double;    {Julian day number}
> >>>> >                  ipl         : Integer;   {planet number}
> >>>> >                  iflag       : Longint;   {flag bits}
> >>>> >                  var xx      : double;    {first of 6 doubles}
> >>>> >                  sErr        : PChar      {Error-String}
> >>>> > ): Longint; stdcall; far; external 'swedll32.dll' name '_swe_calc en 24
> ';
> >>>> > _________________________________________________________
> >>>> > Ahora estoy escribiendo con Lazarus un programa que funcione en
> >>>> > Windows y en
> >>>> > Linux de la siguiente manera:
> >>>> > _________________________________________________________
> >>>> >
> >>>> > uses ...dynlibs...
> >>>> > (...)
> >>>> >
> >>>> > type
> >>>> >   swe_calc = function(tjd    : double;    {Julian day number}
> >>>> >                  ipl         : Integer;   {planet number}
> >>>> >                  iflag       : Longint;   {flag bits}
> >>>> >                  var xx      : double;    {first of 6 doubles}
> >>>> >                  sErr        : PChar      {Error-String}
> >>>> > ): Longint; stdcall;
> >>>> >
> >>>> > var
> >>>> >   astro_Handle:TLibHandle=dynlibs.NilHandle;
> >>>> >   swCalc: swe_calc;
> >>>> >   FuncResult: longint;
> >>>> >   xx : array [0..6] of double;
> >>>> >   err: PChar;
> >>>> >   (...)
> >>>> >
> >>>> >   {$IFDEF Windows}
> >>>> >     astro_Handle := LoadLibrary('swedll32.dll');
> >>>> >   {$ELSE}
> >>>> >     astro_Handle := LoadLibrary('libswe.so');
> >>>> >   {$ENDIF}
> >>>> >    swCalc := swe_calc(GetProcedureAddress(astro_Handle,
> >>>> > 'swe_calc'));//
> >>>> > '_swe_calc en 24'));
> >>>> >   FuncResult:= swCalc(julday,0,SEFLG_MOSEPH,xx[0],err);  // ***
> ERROR
> >>>> > __________________________________________________________
> >>>> > Cuando llamo a la función me da el siguiente error:
> >>>> > "El proyecto syrius ha lanzado una excepción de la clase 'External:
> >>>> > SIGSEGV'."
> >>>> > Mirando el ensamblador aparece:
> >>>> > "00000000 ??????"
> >>>> > Es decir; que al parecer el error lo da la biblioteca en C.
> >>>> > Las posibilidades sobre lo que he hecho mal que se me ocurren son:
> >>>> > 1) ¿Habré declarado mal xx?
> >>>> > 2) ¿Tendré que recompilar 'libswe.so' para esta distro de Linux en
> >>>> > concreto?
> >>>> > Agradezco vuestra ayuda :-)
> >>>> >
> >>>> >
> >>>> > _______________________________________________
> >>>> > Lazarus-es mailing list
> >>>> > Lazarus-es en lists.lazarus.freepascal.org
> >>>> > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> >>>> >
> >>>>
> >>>>
> >>>>
> >>>> --
> >>>> El que pregunta aprende, y el que contesta aprende a responder.
> >>>>
> >>>> No a la obsolecencia programada:
> >>>>
> >>>>
> http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml
> >>>>
> >>>> Linux User #495070
> >>>> http://domonetic.com/blog
> >>>>
> >>>> _______________________________________________
> >>>> Lazarus-es mailing list
> >>>> Lazarus-es en lists.lazarus.freepascal.org
> >>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> >>>
> >>>
> >>>
> >>>
> >>> --
> >>> Nota: Por problemas con el e-mail. Puede que recibas de nuevo este
> >>> mensaje en un tiempo.
> >>>
> >>> _______________________________________________
> >>> Lazarus-es mailing list
> >>> Lazarus-es en lists.lazarus.freepascal.org
> >>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> >>>
> >>
> >> _______________________________________________
> >> Lazarus-es mailing list
> >> Lazarus-es en lists.lazarus.freepascal.org
> >> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> >>
> >
> >
> >
> > --
> > Nota: Por problemas con el e-mail. Puede que recibas de nuevo este
> mensaje
> > en un tiempo.
> >
> > _______________________________________________
> > Lazarus-es mailing list
> > Lazarus-es en lists.lazarus.freepascal.org
> > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> >
>
>
>
> --
> El que pregunta aprende, y el que contesta aprende a responder.
>
> No a la obsolecencia programada:
>
> http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml
>
> Linux User #495070
> http://domonetic.com/blog
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>



-- 
*Nota: Por problemas con el e-mail. Puede que recibas de nuevo este mensaje
en un tiempo.*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20150120/70356d66/attachment-0002.html>


More information about the Lazarus-es mailing list