UDF não funciona com campo Inteiro
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.
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
Curtidas 0
Respostas
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.
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