![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
UDF для Firebird [D7, FireBird]
pavel_guzhanov © (2007-11-28 11:13:00)Пишу 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?
Правильный_Вася (2007-11-28 11:46:00) [1]вообще-то все это прекрасно делается встроенными средствами
Сергей М. (2007-11-28 11:43:00) [2]
> pavel_guzhanov
Вместо malloc() пользуй ib_util_malloc() из состава ib_utils.dll, иначе рано или поздно получишь грабли.
И проверь, что при инициализации твоей udf dll переменная IsMultiThread установлена в True, иначе опять же грабли.
pavel_guzhanov (2007-11-28 11:35:00) [3]Спасибо, все заработало
Сергей М. (2007-11-28 11:34:00) [4]RETURNS CSTRING(10) FREE_IT
Иначе будет утечка.
Slym (2007-11-28 11:31:00) [5]IntToStr(Nom^)
pavel_guzhanov (2007-11-28 11:28:00) [6]
> Nom:PInteger?
А как его потом перевести в String?
Slym (2007-11-28 11:25:00) [7]Slym © (28.11.07 11:24) [3]
протупил
Slym (2007-11-28 11:24:00) [8]strPCopy(Result, PChar(tmp));
Slym (2007-11-28 11:23:00) [9]pavel_guzhanov © (28.11.07 11:14) [1]
Nom:Integer
Nom: PInteger?
pavel_guzhanov (2007-11-28 11:14:00) [10]Из 4 функций я в коде показал только две, одну работающую и одну не работающую