Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 функций я в коде показал только две, одну работающую и одну не работающую


Наверх

Титульная страница Поиск, карта сайта Написать письмо