Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.022 c
2-1206460637
QAT
2008-03-25 18:57
2008.04.20
Битовые флаги


15-1204621683
AndreyD
2008-03-04 12:08
2008.04.20
TMPHexEdit и русские буквы


15-1204390811
Ник
2008-03-01 20:00
2008.04.20
Потерял "горячие" клавиши :(


9-1168767810
GamerProg
2007-01-14 12:43
2008.04.20
Проффи программист разработчик игр


15-1204547059
TIF
2008-03-03 15:24
2008.04.20
Exit poll, выборы и... немного математики. Любителям головоломок