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