[Lazarus-es] Problema con LoadLibrary

Maxi maximiliano.duarte en gmail.com
Mar Ene 20 17:33:39 CET 2015


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




More information about the Lazarus-es mailing list