Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.069 c
15-1204548079
Dmitry S
2008-03-03 15:41
2008.04.20
один DCHP в двух сетях


15-1204749799
Triton5
2008-03-05 23:43
2008.04.20
Простая программа, которая делает скрины экрана...


2-1206456673
tim
2008-03-25 17:51
2008.04.20
вопрос по потокам


2-1206252269
Igor23
2008-03-23 09:04
2008.04.20
Активные формы


15-1204892867
@!!ex
2008-03-07 15:27
2008.04.20
Где можно купить летучую мышь?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский