[firebase-br] UDF - Linux

marlon david de souza marlon em sysmo.com.br
Qui Jul 13 11:16:46 -03 2006


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