[firebase-br] Fwd: Re: Fwd: Criando uma UDF no Firebird 2.1

Eliseu Corrona eliseucorrona em jbsoft.com.br
Ter Out 27 10:44:02 -03 2009


Olá amigo Pha. Tranquilo?
Obrigado por sua resposta.
Referente a definição do método na dll eu tinha exatamente como você 
mencionou. Já estou utilizando o "cdecl". Porém o erro persiste.
Realmente não sei o que pode ser... notei que no fórum há vários 
usuários com o mesmo problema. Tudo é criado passo a passo porém na 
execução não funciona.

De qualquer forma.
Obrigado pela sua resposta.

Att.

Eliseu.

-------- Mensagem original --------
Assunto: 	Re: [firebase-br] Fwd: Criando uma UDF no Firebird 2.1
Data: 	Tue, 27 Oct 2009 08:51:56 -0200
De: 	Pha <lista em pha.com.br>
Responder a: 	FireBase <lista em firebase.com.br>
Para: 	FireBase <lista em firebase.com.br>



Tente declarar a função com CDECL.

Exemplo:

interface

function F_Mod(var iNum1, iNum2: Int64): Int64; cdecl; export;


implementation

uses
   SysUtils, Math;

{
   Retorna o resto da divisao
}
function F_Mod(var iNum1, iNum2: Int64): Int64;
begin
   try
     if (iNum1 = 0) or (iNum2 = 0) then begin
       Result := 0;
       Exit;
     end;
     Result := iNum1 mod iNum2;
   except
     Result := 0;
   end;
end;



Você tem que declarar a mesma no banco também.

Exemplo:

declare external function FMod
   Numeric(18, 0), Numeric(18, 0)
   returns
   Numeric(18, 0) by value
   entry_point 'F_Mod' module_name 'udfpha';


2009/10/26 Eliseu Corrona<eliseucorrona em jbsoft.com.br>

>   Olá amigos, tudo bem?
>  Preciso criar uma UDF no Firebird 2.1, porém, apesar de seguir todos os
>  passos de alguns exemplos que encontrei na internet, consegui criá-la porém
>  não executá-la.
>
>  O exemplo que criei é simples. Criei uma Dll no delphi para retornar o
>  módulo de um número e postei todos os passos abaixo.
>  É gerado um erro na execução e não teve jeito de fazer funcionar. Li alguns
>  relatos no fórum sobre o mesmo erro. O meu sistema operacional é o Windows
>  XP 32bits e o Firebird é a versão 2.1.218118.
>
>  Grato se puderem ajudar.
>
>
>
>  *Unit de funções da DLL:*
>
>  unit UdfFunctions;
>
>  interface
>
>  function Modulo(var i, j: Integer): Integer; cdecl; export;
>
>  implementation
>
>  function Modulo(var i, j: Integer): Integer;
>  begin
>   if (j = 0) then
>     result := -1 // just check the boundary condition, and
>     // return a reasonably uninteresting answer.
>   else
>     result := i mod j;
>  end;
>
>  end.
>
>
>  *Declaração da DLL:*
>  library DllUtils;
>
>  { 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,
>   UdfFunctions in 'UdfFunctions.pas';
>
>
>
>  {$R *.res}
>
>
>  exports
>   Modulo;
>
>  begin
>
>  end.
>
>
>  *Código para criar a UDF no firebird:*
>  declare external function f_Modulo integer, integer
>  returns
>  integer free_it
>  entry_point 'Modulo' module_name 'DllUtils';
>
>
>  *SQL de execução:*
>  select f_Modulo(3, 2) from rdb$database;
>
>  *Erro gerado:*
>  Invalid token.
>  invalid request BLR at offset 60.
>  function F_MODULO is not defined.
>  module name or entrypoint could not be found.
>
>
>  ______________________________________________
>  FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>  Para saber como gerenciar/excluir seu cadastro na lista, use:
>  http://www.firebase.com.br/fb/artigo.php?id=1107
>  Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



-- 
Paulo Henrique Albanez (PHA)
VirtualSystem Informática Ltda
Nova Odessa / SP - Brazil
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa

__________ Informação do ESET NOD32 Antivirus, versão da vacina 4537 (20091023) __________

A mensagem foi verificada pelo  ESET NOD32 Antivirus.

http://www.eset.com









Mais detalhes sobre a lista de discussão lista