Текущий архив: 2004.06.13;
Скачать: CL | DM;
ВнизПроблема с UDF Найти похожие ветки
← →
sashag (2004-05-20 17:15) [0]При вызове функции 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"
← →
Соловьев © (2004-05-20 17:18) [1]
> RETURNS CSTRING(32765) FREE_IT
FREE_IT - убрать. Это если ты сам выделяешь память.
← →
Соловьев © (2004-05-20 17:20) [2]
> RETURNS CSTRING(32765) FREE_IT
32765 - єто зачем же скоко???
Типа - Дата от рождества христова , когда умер тот-то и родился тот-то??? :)
← →
sashag (2004-05-20 17:22) [3]Руководствовался документом http://www.ibase.ru/devinfo/udf_ok.htm
Убрал FREE_IT - проблема осталась
← →
Соловьев © (2004-05-20 17:25) [4]
> GET_DATE name "DATE";
а зачем так? я всегда пишу имя функции...
> но как только ставлю базу и DLL на машину
надеюсь в папку UDF сервака? и сервер перезапустил?
← →
sashag (2004-05-20 17:28) [5]Писал и имя функции - не помогло.
DLL поставил в папку Firebird1.5\udf
← →
jack128 © (2004-05-20 17:30) [6]
> FREE_IT - убрать. Это если ты сам выделяешь память.
не-а.
С памятью в UDF в корни не правильно работаешь.
экспортируй из ib_util.dll ib_util_malloc и выделяй память под результат с помощью этой функции. free_it нужно оставить иначе будет утечка памяти. Помоему на ibase.ru была статья проо написание udf - внимательно её перечитай..
← →
Соловьев © (2004-05-20 17:31) [7]сервер перезапустил?
> ENTRY_POINT "DATE" MODULE_NAME "rp_bill"
ENTRY_POINT "DATE" MODULE_NAME "rp_bill.dll"
← →
sashag (2004-05-20 17:34) [8]Сервер перезапустил, указал MODULE_NAME "rp_bill.dll"
- все равно не работает
← →
jack128 © (2004-05-20 17:42) [9]кстати, если точка в формате это именно точка, а не разделитель частей даты в системе, то тоже самое можно написать используя sql ;-)
← →
sashag (2004-05-20 17:44) [10]Точка - разделитель даты в системе.
В этой DLL несколько функций, и аналогичная проблема при вызове любой из них
← →
Соловьев © (2004-05-20 17:44) [11]И вообще, такие вещи, ИМХО, надо делать на клиенте. Нехрен нагружать сервак чем не попадя.
← →
sashag (2004-05-20 17:49) [12]> И вообще, такие вещи, ИМХО, надо делать на клиенте. Нехрен нагружать сервак чем не попадя.
Функции используются в хранимых процедурах
Но проблему это не решает, не так-ли?
← →
Соловьев © (2004-05-20 17:53) [13]
> [12] sashag (20.05.04 17:49)
[9] от себя намекну - см. extract
← →
sashag (2004-05-20 18:01) [14]Аналогичная ошибка:
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"
← →
Desdechado © (2004-05-21 15:53) [15]судя по ошибке, не находит длл
попробуй подкинуть ее в систтемный каталог для эксперимента
а по поводу выделения памяти - дельное замечание. в [14] у тя борландовский менеджер памяти выделяет, а освобождение осуществляется сервером, а у него менеджер от мелкомягких - они несовместимы. Гарантированы утечки, возможен падеж сервера
← →
inic © (2004-05-24 14:26) [16]Такая же тема у меня была!!!
Но дело в том, что вот этот самый export в конце объявления
функции не х..я уже не значит (начиная с какой-то версии Дельфи) - в справке кстати это написано.
Т.е. функция эта компилируется не как экспортная, а как простая.
Нужно использовать exports - см. справку.
← →
inic © (2004-05-24 14:28) [17]Хотя извиняюсь, проблема то у тебя не в этом :(
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.023 c