[firebase-br] UDF - Linux Para o Marlon David
marlon david de souza
marlon em sysmo.com.br
Qui Jul 13 13:29:34 -03 2006
DECLARE EXTERNAL FUNCTION Teste
CSTRING(16)
RETURNS CSTRING(12)
ENTRY_POINT 'Fn_Teste' MODULE_NAME 'udfteste.so';
function Fn_Teste(APrm1: PChar): PChar; cdecl; export;
.
.
.
function Fn_Teste(APrm1: PChar): PChar;
var
sLinha: String;
begin
sLinha := APrm1;
.
.
StrPCopy(result, sLinha);
end;
Em Qui 13 Jul 2006 18:41, marcelo escreveu:
> Caro Marlon, primeiramente obrigado.
>
> Usei a sua sugestão, mas infelizmente não funcionou. Fiz um outro teste na
> UDF para que o resultado fosse numerico de acordo com o dado recebido.
> O que conclui é que a string não esta chegando corretamente. Pois fazendo
> um teste na UDF se o dado enviado fosse = "X" eu retornaria 0 caso
> contrário retornaria 1, sempre retornou 1 ou seja o problema é na chegada
> dos dados. Você já fez alguma UDF com string que funcionasse em Linux
> compilada com o Kylix ? Se sim pode me mandar um exemplo. ? Existe alguma
> configuração especial no FB para este tipo de UDF ?
>
> Marcelo
>
>
>
>
> ----- Original Message -----
> From: "marlon david de souza" <marlon em sysmo.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Thursday, July 13, 2006 11:16 AM
> Subject: Re: [firebase-br] UDF - Linux
>
>
> No Firebird defina os parametros string da função como sendo do tipo
> "CSTRING". Já no Kylix defina como sendo do tipo "PChar" e use o parametro
> "cdecl". Obs: para passar o resultado da função para a variável "result"
> use o comando "StrPCopy". Exemplo: StrPCopy(result, sVar1);
>
> Em Qui 13 Jul 2006 13:27, marcelo escreveu:
> > Caros amigos da Lista.
> >
> > Utilizo o Firebird já a um bom tempo e desde o inicio tive necessidade de
> > criar algumas rotinas proprias atraves das UDF. Fiz uma UDF própria para
> > Windows ( Via Delphi ) e recompilava a mesma no Kylix para Linux. Tudo
> > funcionou muito bem ate que tive a necessidade de criar uma função para
> > tratar Strings. No windows funcionou mas no linux o servidor de banco
> > trava
> > quando faço a chamada da função.
> > Detalhes : Estou utilizando o Firebird 1.5.2 ( Windows e Linux ), Delphi
> > 7 e Kylix 3.
> >
> > Exemplo de uma UDF QUE ESTA FUNCIONANDO tanto em Windows quanto em Linux.
> > Declaracao :
> > DECLARE EXTERNAL FUNCTION truncnum
> > DOUBLE PRECISION, INTEGER
> > RETURNS DOUBLE PRECISION BY VALUE
> > ENTRY_POINT 'Truncate' MODULE_NAME 'Nova_UDF';
> >
> >
> >
> > Função no Delphi/Kylix
> > function Truncate(var W_Nr: Double; var W_Dec: Integer): Double; cdecl;
> > export; var
> > W_Mult Double;
> > begin
> >
> > W_Mult := W_Nr * 100;
> >
> > end;
> >
> > Esta função acima é somente para exemplificar, se eu fizer algo como
> > SELECT TRUNCNUM(COLUNA1) FROM TABELA1, o Windows executa e o LInux também
> > sem problema nenhum.
> >
> >
> > Exemplo de uma UDF QUE ESTA FUNCIONANDO no Windows MAS NAO FUNCIONA em
> > Linux.
> >
> > Declaracao no banco:
> >
> > DECLARE EXTERNAL FUNCTION CONECTA
> > CSTRING(100)
> > RETURNS CSTRING(100) FREE_IT
> > ENTRY_POINT 'NConecta' MODULE_NAME 'Nova_UDF';
> >
> > Função no Delphi/Kylix :
> >
> > function NConecta(W_String: PChar): PChar; cdecl; export;
> >
> > begin
> >
> > Result := 'Meu retorno';
> >
> >
> > end;
> >
> > Esta função acima é somente para exemplificar, se eu fizer algo como
> > SELECT CONECTA(COLUNA1) FROM TABELA1, o Windows executa mas o LInux Não.
> >
> > Acredito que problema possa ser :
> > a) Na declaracao da UDF no banco, estou utilizando CSTring mas já tentei
> > enviar como CHAR e VARCHAR e também não resolveu.
> > b) OU pode ser o tipo de dados que estou recebendo em minha DLL ( PChar
> > ), utilizei PChar pois no Windows foi a unica maneira de funcionar. C) Ou
> > parametros cdecl que é declarado na DLL ( Não sei a diferença entre cdecl
> > e stdcall, por isso mantive a que vi em alguns exemplos. )
> >
> >
> >
> > Se alguém tiver alguma dica agradeceria muito.
> >
> > Marcelo
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para editar sua configuração na lista, use o endereço
> > http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br Para
> > consultar mensagens antigas: http://firebase.com.br/pesquisa
>
> --
> Sem mais,
>
> ----------------------
> Marlon David de Souza
> Desenvolvimento
> Sysmo Informática Ltda
Mais detalhes sobre a lista de discussão lista