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

Alexandre alexandrecrt em gmail.com
Sáb Maio 21 19:40:45 -03 2016


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

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

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

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

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


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

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

exports
soma;
*****************************************************************************

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

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

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

Abraços.
























Mais detalhes sobre a lista de discussão lista