[Lazarus-es] Problema con LoadLibrary

Juan M. Puertas soft.sirius en gmail.com
Lun Ene 19 22:29:41 CET 2015


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.*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20150119/18bb789e/attachment-0002.html>


More information about the Lazarus-es mailing list