Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problema con parámetros en UDF's (https://www.clubdelphi.com/foros/showthread.php?t=16970)

Héctor Randolph 17-12-2004 21:51:47

Problema con parámetros en UDF's
 
Hola a todos!

Utilizo FireBird 1.5.1, Delphi 7 y Windows XP; tengo problemas con los parámetros en las UDF's.

Escribí la siguiente función en una librería y la coloque en la carpeta <DIR_INSTAL_FIRBIRD>\UDF

Código Delphi [-]
library Project1;

{$E DLL}

{$R *.res}

function TEST(Value:Integer):Integer;cdecl;export;
begin
  Result:=Value*10;
end;

Exports
  TEST;

begin
end.

Posteriormente declare la función y un procedimiento para llamarla en mi base de datos.

Código SQL [-]
DECLARE EXTERNAL FUNCTION T1
    INTEGER
RETURNS INTEGER BY DESCRIPTOR
ENTRY_POINT 'TEST' MODULE_NAME 'project1'

Código SQL [-]
CREATE PROCEDURE PRUEBA 
RETURNS ( VAL INTEGER )
AS
BEGIN
  VAL=T1(10);
END

Si ejecuto el procedimiento me muestra lo siguiente:

Procedure executing results:
VAL = 193302400

Obviamente este no es el resultado que debería devolver y en general cualquier función que utilizo con parámetros INTEGER o DOUBLE tiene el mismo comportamiento.

Espero que alguién pueda ayudarme a resolverlo.

De ante mano muchas gracias.

Al González 17-12-2004 22:50:59

StdCall en lugar de CDecl
 
¡Buen día a todos!

Creo que el problema se debe al uso de la convención de llamada CDecl en lugar de StdCall (la utilizada para las UDFs de InterBase/Firebird).

Espero esto sea de utilidad, seguimos en contacto.

Al González :).

Héctor Randolph 18-12-2004 01:15:16

Gracias por responder Al González.

Modifique la declaración de la función por stdcall como lo indicaste, pero desafortunadamente obtengo el mismo resultado.

Seguramente hay algo que aún desconozco al respecto de las UDF's, si alguién tiene algún ejemplo de cómo se programan estas funciones con Delphi 7 y FireBird o Interbase les agredecería que me lo hicieran llegar por este medio.

Nuevamente gracias.

Al González 18-12-2004 06:50:29

¡Hola de nuevo!

Creo que debes usar By Value en lugar de By Descriptor, ya que de lo contrario Firebird/InterBase toma los argumentos y resultados de UDFs como parámetros por referencia.

Es decir, casi podría segurar que el valor 193302400, que mencionas en tu ejemplo es la dirección de memoria de un entero que tiene un valor de 100.

Espero esto sea de utilidad, seguimos en contacto.

Al González :).

Héctor Randolph 19-12-2004 22:19:44

OK!

Problema solucionado.

Mil gracias Al González.

Héctor Randolph 21-12-2004 07:59:55

Feliz con el resultado
 
Nota al mensaje anterior:

El problema lo solucione modificando los parámetros de la función para recibirlos por referencia, es decir agregando la cláusula var antes de la variable de tipo entero.

Código Delphi [-]
function TEST(var Value:Integer):Integer;stdcall;export;
begin
  Result:=Value*10;
end;

Me ha sido de gran utilidad para mi trabajo, nuevamente mil gracias.


La franja horaria es GMT +2. Ahora son las 09:30:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi