Текущий архив: 2008.04.20;
Скачать: CL | DM;
Вниз
UDF для Firebird Найти похожие ветки
← →
pavel_guzhanov © (2007-11-28 11:13) [0]Пишу UDF для firebird. В ней используестя 4 функции. Три из них работают нормально, четвертая нет. Код:
library StrUdf;
uses
SysUtils,
Classes;
function malloc(Size:Integer):Pointer; cdecl; external "msvcrt.dll";
function LastName(Fio:PChar):PChar; cdecl; export;
var i:integer;
f, tmp:String;
begin
f:=String(trim(Fio));
i:=Pos(" ", F);
tmp:=Copy(F, 1, i-1);
Result:=malloc(length(tmp)+1);
StrPCopy(Result, tmp);
end;
function NomPasp(Nom:Integer):PChar; cdecl; export;
var len:Integer;
NomPaspStr, tmp:String;
begin
NomPaspStr:=IntToStr(Nom);
len:=Length(NomPaspStr);
case len of
3: tmp:="000"+NomPaspStr;
4: tmp:="00"+NomPaspStr;
5: tmp:="0"+NomPaspStr;
else
tmp:=NomPaspStr;
end;
result:=malloc(length(tmp)+1);
strPCopy(Result, tmp);
end;
exports
LastName, NomPasp;
{$R *.res}
begin
end.
Первая функция получает на вход ФИО и возвращает только фамилию, работает нормально.
Вторая получает число, преобразует его в строку, если она короче 6 цифр, то дополняет его нулями. Если короче 3 цифр или длиннее 6, то оставляет без изменений и возвращает это строковое значение.
в базе эти функции объявлены так:DECLARE EXTERNAL FUNCTION GET_LASTNAME
CSTRING(84)
RETURNS CSTRING(84)
ENTRY_POINT "LastName" MODULE_NAME "StrUdf";
иDECLARE EXTERNAL FUNCTION GET_NOMPASP
INTEGER
RETURNS CSTRING(10)
ENTRY_POINT "NomPasp" MODULE_NAME "StrUdf";
Помогите разобраться, что я делаю не так в функции NomPasp?
← →
pavel_guzhanov © (2007-11-28 11:14) [1]Из 4 функций я в коде показал только две, одну работающую и одну не работающую
← →
Slym © (2007-11-28 11:23) [2]pavel_guzhanov © (28.11.07 11:14) [1]
Nom:Integer
Nom:PInteger?
← →
Slym © (2007-11-28 11:24) [3]strPCopy(Result, PChar(tmp));
← →
Slym © (2007-11-28 11:25) [4]Slym © (28.11.07 11:24) [3]
протупил
← →
pavel_guzhanov © (2007-11-28 11:28) [5]
> Nom:PInteger?
А как его потом перевести в String?
← →
Slym © (2007-11-28 11:31) [6]IntToStr(Nom^)
← →
Сергей М. © (2007-11-28 11:34) [7]RETURNS CSTRING(10) FREE_IT
Иначе будет утечка.
← →
pavel_guzhanov © (2007-11-28 11:35) [8]Спасибо, все заработало
← →
Сергей М. © (2007-11-28 11:43) [9]
> pavel_guzhanov
Вместо malloc() пользуй ib_util_malloc() из состава ib_utils.dll, иначе рано или поздно получишь грабли.
И проверь, что при инициализации твоей udf dll переменная IsMultiThread установлена в True, иначе опять же грабли.
← →
Правильный_Вася (2007-11-28 11:46) [10]вообще-то все это прекрасно делается встроенными средствами
Страницы: 1 вся ветка
Текущий архив: 2008.04.20;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.033 c