Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-12-2004
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 17-12-2004
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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 .
Responder Con Cita
  #3  
Antiguo 18-12-2004
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 18-12-2004
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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 .
Responder Con Cita
  #5  
Antiguo 19-12-2004
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
OK!

Problema solucionado.

Mil gracias Al González.
Responder Con Cita
  #6  
Antiguo 21-12-2004
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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.

Última edición por Héctor Randolph fecha: 21-12-2004 a las 08:03:39.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 04:55:00.


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
Copyright 1996-2007 Club Delphi