Главная страница
    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.46 MB
Время: 0.033 c
8-1178974125
Veter
2007-05-12 16:48
2008.04.20
Удаление TImage


2-1206293531
Face
2008-03-23 20:32
2008.04.20
как сделать событие OnCellClick при нажатии пробела на ячейке


15-1204611655
oldman
2008-03-04 09:20
2008.04.20
Перенос системы (МЕ) и ПО


6-1185196401
Newfrost
2007-07-23 17:13
2008.04.20
idHTTP и проблемы с кодировкой


2-1206337658
beglec
2008-03-24 08:47
2008.04.20
Удаление данных из потока TMemoryStream





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский