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

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

Проблема с UDF [D5, FB 1.5]


sashag ©   (2004-05-20 17:15:00) 

При вызове функции UDF на машине, где написана DLL, никаких проблем не наблюдается, но как только ставлю базу и DLL на машину, где это все должно работать - тут же при вызове функции возникает ошибка:

Invalid request BLR at offset 1338 function GET_DATE is not defined module name or entrypoint could not be found

Возможно-ли это излечить?

function get_date(var PDate: TIBDateTime): PChar; cdecl; export;
var _PDate: TDate;
begin
 with PDate do _PDate := Days - IBDateDelta + MSec10 / MSecsPerDay10;
 Result:= PChar(FormatDate('dd.mm.yyyy', _PDate));
end;


exports
 GET_DATE name 'DATE';


DECLARE EXTERNAL FUNCTION GET_DATE
   DATE
RETURNS CSTRING(32765) FREE_IT
ENTRY_POINT 'DATE' MODULE_NAME 'rp_bill'


inic   (2004-05-24 14:28:00) [1]

Хотя извиняюсь, проблема то у тебя не в этом :(


inic   (2004-05-24 14:26:00) [2]

Такая же тема у меня была!!!
Но дело в том, что вот этот самый export в конце объявления
функции не х..я уже не значит (начиная с какой-то версии Дельфи) - в справке кстати это написано.
Т.е. функция эта компилируется не как экспортная, а как простая.
Нужно использовать exports- см. справку.


Desdechado   (2004-05-21 15:53:00) [3]

судя по ошибке, не находит длл
попробуй подкинуть ее в систтемный каталог для эксперимента

а по поводу выделения памяти - дельное замечание. в [14] у тя борландовский менеджер памяти выделяет, а освобождение осуществляется сервером, а у него менеджер от мелкомягких - они несовместимы. Гарантированы утечки, возможен падеж сервера


sashag   (2004-05-20 18:01:00) [4]

Аналогичная ошибка:

function get_namemonth(var PDate: TIBDateTime): PChar; cdecl; export;
var _PDate: TDate;
   Y, M, D: Word;
begin
 with PDate do _PDate := Days - IBDateDelta + MSec10 / MSecsPerDay10;
 DecodeDate(_PDate, Y, M, D);
 case M of
    1: Result:= PChar('Січень ' + IntToStr(Y) + ' р.');
    2: Result:= PChar('Лютий ' + IntToStr(Y) + ' р.');
    3: Result:= PChar('Березень ' + IntToStr(Y) + ' р.');
    4: Result:= PChar('Квітень ' + IntToStr(Y) + ' р.');
    5: Result:= PChar('Травень ' + IntToStr(Y) + ' р.');
    6: Result:= PChar('Червень ' + IntToStr(Y) + ' р.');
    7: Result:= PChar('Липень ' + IntToStr(Y) + ' р.');
    8: Result:= PChar('Серпень ' + IntToStr(Y) + ' р.');
    9: Result:= PChar('Вересень ' + IntToStr(Y) + ' р.');
   10: Result:= PChar('Жовтень ' + IntToStr(Y) + ' р.');
   11: Result:= PChar('Листопад ' + IntToStr(Y) + ' р.');
   12: Result:= PChar('Грудень ' + IntToStr(Y) + ' р.');
 else
   Result:= PChar('ERROR NAME MONTH');
 end;
end;


exports
 GET_NAMEMONTH name 'NMONTH';


DECLARE EXTERNAL FUNCTION GET_NAMEMONTH
   DATE
RETURNS CSTRING(250) FREE_IT
ENTRY_POINT 'NMONTH' MODULE_NAME 'rp_bill.dll'


Соловьев   (2004-05-20 17:53:00) [5]


>  [12] sashag   (20.05.04 17:49)

[9] от себя намекну - см. extract


sashag   (2004-05-20 17:49:00) [6]

> И вообще, такие вещи, ИМХО, надо делать на клиенте. Нехрен нагружать сервак чем не попадя.

Функции используются в хранимых процедурах

Но проблему это не решает, не так-ли?


Соловьев   (2004-05-20 17:44:00) [7]

И вообще, такие вещи, ИМХО, надо делать на клиенте. Нехрен нагружать сервак чем не попадя.


sashag   (2004-05-20 17:44:00) [8]

Точка - разделитель даты в системе.
В этой DLL несколько функций, и аналогичная проблема при вызове любой из них


jack128   (2004-05-20 17:42:00) [9]

кстати, если точка в формате это именно точка, а не разделитель частей даты в системе, то тоже самое можно написать используя sql ;-)


sashag   (2004-05-20 17:34:00) [10]

Сервер перезапустил, указал MODULE_NAME 'rp_bill.dll'
- все равно не работает


Соловьев   (2004-05-20 17:31:00) [11]

сервер перезапустил?


> ENTRY_POINT 'DATE' MODULE_NAME 'rp_bill'

ENTRY_POINT 'DATE' MODULE_NAME 'rp_bill.dll'


jack128   (2004-05-20 17:30:00) [12]


> FREE_IT - убрать. Это если ты сам выделяешь память.
не-а.

С памятью в UDF в корни не правильно работаешь.
экспортируй из ib_util.dll ib_util_malloc и выделяй память под результат с помощью этой функции. free_it нужно оставить иначе будет утечка памяти. Помоему на ibase.ru была статья проо написание udf - внимательно её перечитай..


sashag   (2004-05-20 17:28:00) [13]

Писал и имя функции - не помогло.
DLL поставил в папку Firebird1.5\udf


Соловьев   (2004-05-20 17:25:00) [14]


> GET_DATE name 'DATE';

а зачем так? я всегда пишу имя функции...


> но как только ставлю базу и DLL на машину

надеюсь в папку UDF сервака? и сервер перезапустил?


sashag   (2004-05-20 17:22:00) [15]

Руководствовался документом http://www.ibase.ru/devinfo/udf_ok.htm

Убрал FREE_IT - проблема осталась


Соловьев   (2004-05-20 17:20:00) [16]


> RETURNS CSTRING(32765) FREE_IT

32765 - єто зачем же скоко???
Типа - Дата от рождества христова , когда умер тот-то и родился тот-то??? :)


Соловьев   (2004-05-20 17:18:00) [17]


> RETURNS CSTRING(32765) FREE_IT

FREE_IT - убрать. Это если ты сам выделяешь память.


Наверх

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