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)
-   -   Problemas con UDF (https://www.clubdelphi.com/foros/showthread.php?t=15345)

EITB 19-10-2004 21:02:32

Problemas con UDF
 
Buen dia despues de estar en una ardua investigacion de las udf y darle un ojo al articulo de UDF de este foro, no puedo resolver este problema intento crear una udf que contiene un codigo siemple y sin chiste, como prueba para crear la libreria que necesito para mi aplicacion , pero no he podido con la prueba :confused: , esto es lo que he hecho pero no encuentro porque no funciona
Esta es mi DLL
Código:


unit Unit1;
interface
function StrMid(pCadena : String; iIndex : Integer ; iNum : integer) : ShortString; cdecl; export;
implementation
function StrMid(pCadena : String; iIndex : Integer ; iNum : integer) : ShortString;
begin
        result := copy(pCadena,iIndex,Inum);
end;
end.

y este es el codigo que utilizo en interbase

Código:

DECLARE EXTERNAL FUNCTION F_FSSTRMID
CSTRING(256) CHARACTER SET NONE, INTEGER, INTEGER
RETURNS CSTRING(256) CHARACTER SET NONE FREE_IT
ENTRY_POINT 'StrMid' MODULE_NAME 'fsStrMid';

esta es la prueba que hago
Código:

select SUS_IDUSUARIO from S_USUARIO WHERE SUS_IDUSUARIO = cast(F_FSSTRMID('123',1,1) as integer)
pero al momento de ejecutar esto , hace un shutdow y tengo que cerrar la consola , alguna idea :( de lo que estoy haciendo mal o algun paso que halla omitido

Bueno de antemano muchas gracias

Sinaloense 20-10-2004 01:23:48

Tienes un error con los parametros, las UDF solo aceptan parametros por referencia y no acepta strings, tienes qe usar pchar en su lugar.

function StrMid(pCadena : String; iIndex : Integer ; iNum : integer) : ShortString; cdecl; export;

sería:

function StrMid(pCadena : pchar; var iIndex : Integer ; var iNum : integer) : pchar; cdecl; export;

StartKill 21-10-2004 18:36:40

Holas,

Utilizo Delphi 7.0 interbase 7.1.
Escribo estas lineas, no para dar respuesa a este hilo si para invocar ayuda a uds.

Original de EITB
Código Delphi [-]
unit Unit1;
interface
function StrMid(pCadena : String; iIndex : Integer ; iNum : integer) : ShortString; cdecl; export;
implementation
function StrMid(pCadena : String; iIndex : Integer ; iNum : integer) : ShortString;
begin
   result := copy(pCadena,iIndex,Inum);
end;
end.

El asunto es que yo para crar una DLL hago siguiente,

Elijo la Opcion <File/New/Other...> alli aparce un folder con muchas pestañas y elijo <New> dentro de esta hay un icono que dice <DLL wizard>.. le hago click ;)

Me aparece el siguiente codigo:
Código Delphi [-]
library Project1;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes;

{$R *.res}

begin
end.

Teniendo esta estructura procedi a crear mi funcion asi:

Código Delphi [-]
library Project1;

{ ...
   .... }

uses
  SysUtils,
  Classes;

{$R *.res}
Function Suma_01(var XX:Integer):Integer;cdecl;export;
Var
  nUno:Integer;
begin
  nUno:=0;
  Result:=XX+nUno;
end;
end.
Procedi a compilarlo y me resulto <project1.dll> y lo copie a la carpeta BIN de interbase.
Abri mi ibexpert y declare mi funcion asi:
Código SQL [-]
declare external function suma_01 integer returns integer
entry_point 'suma_01' module_name 'project1.dll';
Hasta alli todo parece correcto, pero cuando intento utilizar dicha funcion..
Código SQL [-]
SELECT SUMA_01(FID) AS ID, FDES_AREA FROM AREA
Me envia el siguiente error:
Código:

Invalid token.
invalid request BLR at offset 78.
function SUMA_01 is not defined.
module name or entrypoint could not be found.

Como obsevan primero, la forma de creal la DLL es totalmente diferente a la escrita por nuestro amigo EITB , no estoy utilizando cadenas de caracteres, y el error es diferente, como si no encontrara la funcion....ahora, si no esta la funcion como le hago?, donde estoy fallando?... :confused:

Si alguien pudiera detallar la forma de crear funciones definidas por el usuario en delphi les estaremos agradecidos..

Your friend,

StartKill
Lima-Perú

EITB 21-10-2004 23:12:37

Cita:

Procedi a compilarlo y me resulto <project1.dll> y lo copie a la carpeta BIN de interbase
Yo cuando creo mis UDf siempre meto las dll a la Carpeta UDF del directorio de Interbase ,porque no pruebas cambiandola ahi , espero que te sirva

StartKill 22-10-2004 00:40:40

Holas EITB, tambien lo copie y envia otro error, no me acuerdo en estos momento el mensaje de error..

Pero seria muy servicial de tu parte que explicaras como creas una dll, por que si te das cuenta el codigo que tengo es totalmente diferente al tuyo.

Para no abusar de tu tiempo, lo podrias enviar a mi correo StartKill@hotmail.com y ya con paciencia lo pego en el hilo <con tu permiso>.

A la espera de tu ayuda.

Your friend,

StartKill
Lima-Perú

StartKill 29-10-2004 16:56:41

Holas,

My friend EITB, no he olvidado el e-mail que enviaste... te agradesco el gesto de ayuda...

Quedó una promesa pendiente con respecto a pegar el codigo que enviaras..., para los interesados alli lo tienen:

Email de EITB
Código:

Sigo los mismos pasas que tu
New -> DLL
Creo una nueva unit para mis funciones
pongo su prototipo
hago su implementacion
y pongo la clausula Exports en la parte de DLL con el nombre de la funcion
 
Te mando el codigo de la dll para que la veas
 despues de eso tube que hacer otra funcion para trabajar con fechas y los integer en los parametros tambien me dieron problemas en interbase , parece que nada mas le gustan los pchar asi que te recomiento que lo manejes asi todos los parametros en pchar y ya dentro de tu dll los cambies al tipo que le corresponda de cualquier forma el pchar lo puedes convertir como si fuera una cadena , que al final siempre apunta a una espero que te sirva y suerte
 
EITB

He aqui el archivo *.dpr
Código Delphi [-]
library fsStrMid;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's .... parameters. }

uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas';

{$R *.res}

Exports
    StrMid;

begin
end.

Y como archivo final nuestro *.pas

Código Delphi [-]
unit Unit1;
interface
function StrMid(pCadena : pChar; iIndex : Integer ; iNum : integer) : PChar; cdecl; export;

implementation

function StrMid(pCadena : pChar; iIndex : Integer ; iNum : integer) : PChar;
begin
     result := pChar(copy(pCadena,iIndex,Inum));
end;
end.

Your friend,

StartKill
Lima-Perú


La franja horaria es GMT +2. Ahora son las 07:04:58.

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