UDF não funciona com campo Inteiro

Firebird

13/08/2010

Colegas,
estou com um problema numa UDF que criei e não tenho tido o resultado esperado. Talvez batendo o olho alguém com mais experiência já dê a solução.

Esta udf deveria realizar algumas funcionalidades bastantes específicas no meu projeto, mas eu resumí o problema criando uma udf mais simples para simular o problema.

A função abaixo deveria fazer um copy numa string semelhante ao comando do delphi e ele simplesmente ignora e retorna a string do mesmo jeito que entrou na função.
O interessante é que se eu utilizar um Pchar no lugar do integer ela funciona. Veja a função abaixo:

function CopyDoDelphi(Dados:Pchar; Tamanho:Integer):Pchar; cdecl; export;
var Texto:String;
begin
  Texto := Dados;

  Result := Pchar(Copy(Texto, 1, Tamanho));
end;

//Registrando a udf:
DECLARE EXTERNAL FUNCTION CopyDoDelphi
CSTRING(10000), INTEGER
RETURNS CSTRING(10000)
ENTRY_POINT 'CopyDoDelphi' MODULE_NAME 'NomeDaDLL';

//Testando a UDF
SELECT CopyDoDelphi('abcdefghijklmnopqrstuvxz', 10)
from RDB$DATABASE

RESULTADO APRESENTADO:abcdefghijklmnopqrstuvxz
RESULTADO ESPERADO  :abcdefghij

Pergunto: Por quê este problema ocorre com o campo inteiro e não ocorre com Pchar?
Obs. Tentei Integer, Int64 e Smallint, mas não funcionou.
Grato.
Exata Ltda

Exata Ltda

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

13/08/2010

altere sua função para:


type
  PInteger = ^Integer;

function CopyDoDelphi(Dados:Pchar; Tamanho: PInteger):Pchar; cdecl; export;
var Texto:String;
begin
  Texto := Dados;

  Result := Pchar(Copy(Texto, 1, Tamanho^));
end;


é preciso usar ponteiros porque o conteúdo do parâmetro é uma referência ao valor e não o valor em si.


GOSTEI 0
POSTAR