[firebase-br] UDFs, a quem interessar possa.

Carlos H. Cantu listas em warmboot.com.br
Dom Maio 22 09:53:04 -03 2016


Aqui tem uma documentação muito boa sobre como escrever UDF's, recém
lançada: http://www.firebase.com.br/downloads.php?id=408

[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br

A> Olá amigos, recentemente enviei mensagens informando problemas com 
A> acesso a UDF's.
A> Inicialmente, escrevi a dll em CBuilder, e ao tentar chamá-la no 
A> firebird, gerava erro, algumas vezes, derrubando o servidor.
A> Em testes que eu fiz, escrevendo a dll em Delphi, usei erroneamente o 
A> stdcall, fazendo que não funcionasse.
A> Porém, minha linguagem base hoje é o C++ e o C#, deste modo, não me 
A> interessava escrever as dll's em Delphi.

A> Neste período, usava o Windows 10, porém, voltei para o Windows 7 pois,
A> sinceramente, acho que o 10 ainda precisa amadurecer muito pra ficar bom ...

A> Voltei a fazer testes de acesso a udf's mas sem sucesso.
A> Inconformado, comecei a investigar mais a fundo e a seguir, cito como 
A> resolvi:

A> 1 - Desabilitei o UAC (controle de usuários do windows).
A> Isso porque, quando eu estava com a UAC habilitada, ao tentar acessar a
A> UDF era gerado um erro;
A> 2 - A passagem de parâmetros para a função simples de soma que eu estava
A> escrevendo em C++ tem que ser feita através de PONTEIRO.

A> Vejam um exemplo comparando as funções em Pascal e em C++
A> ******************************************************************************
A> //Declaração e definição da função em C++
A> //Implementado em VStudio 2015 e CBuilder
A> extern "C" __declspec(dllexport) int soma(int *a, int *b)
A> {       
A>         return *a + *b;
A> }


A> //Declaração da função em Pascal
A> function soma(a: Integer; b: Integer): integer; cdecl; export;

A> //Implementação da função em Pascal abaixo
A> function soma(a: Integer; b: Integer): integer;
A> begin
A>         result:= a + b;
A> end;

A> exports
A> soma;
A> *****************************************************************************

A> O grande problema, quando desenvolvi a função em c++ é que eu estava 
A> passando os parâmetros como valor e não como ponteiro. Pensei que, se 
A> tivesse que passar apenas inteiros simples, poderia passar como valor.

A> Porém, se você passar como valor, receberá resultados errados.
A> Mesmo passando simples valores do tipo int (nem estou citando strings)
A> temos que passar os parâmetros através de PONTEIRO.

A> Observem que, em C/C++ não é necessário usar "cdecl", como em Pascal.

A> Abraços.





















A> ______________________________________________
A> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
A> Para saber como gerenciar/excluir seu cadastro na lista, use:
A> http://www.firebase.com.br/fb/artigo.php?id=1107
A> Para consultar mensagens antigas:
A> http://www.firebase.com.br/pesquisa_lista.html





Mais detalhes sobre a lista de discussão lista