Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.059 c
3-1085032891
Alex_x
2004-05-20 10:01
2004.06.13
технология доступа в MIDAS?


3-1085208566
Andriy Tysh
2004-05-22 10:49
2004.06.13
Ошибка в ClientDataSet


1-1085820340
Dextor-andrei
2004-05-29 12:45
2004.06.13
Console Application


1-1085831723
ltexcimer
2004-05-29 15:55
2004.06.13
case и char


3-1085035035
NoName
2004-05-20 10:37
2004.06.13
DBGridEh