![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с 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 - убрать. Это если ты сам выделяешь память.