![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Установил Yaffil_877ss. Не работает UDF. [D6, IB6.x]
kaif © (2004-01-15 17:45:00)
Работал на Yaffil_821ss. Установил Yaffil_877ss.
Перестала вызываться моя функция из UDF.
Ошибка "function FROMAT_DATETIME could not be matched"
При этом "стандартные функции IB" работают.
---------------------
DECLARE EXTERNAL FUNCTION FORMAT_DATETIME
CSTRING(30) CHARACTER SET WIN1251, TIMESTAMP
RETURNS CSTRING(30) CHARACTER SET WIN1251 FREE_IT
ENTRY_POINT "FmtIBDateTime" MODULE_NAME "alg_udf";
эта функция не работает (она моя)
---------------------
DECLARE EXTERNAL FUNCTION strlen
CSTRING(32767)
RETURNS INTEGER BY VALUE
ENTRY_POINT "IB_UDF_strlen" MODULE_NAME "ib_udf";
эта функция работает (она стандартная)
-----------------------
Судя по тексту ошибки, функция не находится по имени.
----------------------------
То, что я нашел в FAQ я не очень понимаю:
Yaffil начиная со сборки 867 компилируется MSVC7. Это означает, что теперь используется сервисная библиотека msvcr7.dll, а не msvcrt.dll как раньше (msvc6). В этой библиотеке есть функция malloc, отвечающая за аллокирование памяти.
Таким образом, если ваши udf содержат фунции с free_it, которые напрямую аллокируют память вызовом функции из msvcrt, или наоборот, делают это правильно через ib_util.dll но от сервера IB или FB, в результате получается что ваша udf использует один менеджер памяти, а сервер - другой. Что и приводит ко всяким проблемам с работоспособностью сервера.
Убедитесь, что ваша функция использует вызов не malloc, а ib_util_malloc, и что ib_util.dll имеет версию Yaffil не ниже 865 сборки (а также что на компьютере нет других ib_util.dll, которые могут быть найдены операционной системой ранее правильной ib_util.dll).
Я как-то работал с MSVC7 и мне кажется, что там имена в dll как-то странно приходилось давать (со знаком подчеркивания или как - не помню). К тому же я понимаю, что мне нужно что-то менять в аллокировании памяти (но это уже видимо другая ошибка, которая пока не проявляется, так как не работает сама функция). Подозреваю, что я вообще должен поменять аллокирование памяти, но как правильно - не знаю. Мой текст функции привожу:
function FmtIBDateTime(FmtStr: PChar; var Value: TISC_QUAD): PChar; cdecl; // free_it
var
Tmp: String;
begin
try
Tmp:= FormatDateTime(StrPas(FmtStr), QuadToDate(Value));
GetMem(Result, Length(Tmp)+1);
try
StrCopy(Result, PChar(Tmp));
except
FreeMem(Result);
raise;
end;
except
Result:= nil;
end;
end;
------------
Буду благодарен за любые разъяснения и любую помощь в правильном написании этой функции.
Desdechado (2004-01-15 18:40:00) [21]
> Yaffil начиная со сборки 867 компилируется MSVC7
вот это мне не нравится. А общий проект Firebird-Yaffil после объединения на чем лепить будут?
Vlad (2004-01-15 18:38:00) [22]
> jack128 © (15.01.04 18:35) [2]
А чего тут понимать ? Выделение пямяти под Result, проблема явно не в этом.
Desdechado (2004-01-15 18:37:00) [23]
опечатка или нет, но в тексте ошибки FROMAT, а в описании FORMAT
jack128 (2004-01-15 18:35:00) [24]
> Убедитесь, что ваша функция использует вызов не malloc,
> а ib_util_malloc, и что ib_util.dll имеет версию Yaffil
> не ниже 865 сборки (а также что на компьютере нет других
> ib_util.dll, которые могут быть найдены операционной системой
> ранее правильной ib_util.dll).
> GetMem(Result, Length(Tmp)+1);
Как это понимать? ;-)
Vlad (2004-01-15 18:27:00) [25]
Проблемы не в реализации функции- однозначно.
Скорее либо библиотеку найти не может, либо Entry Point
Попробуй почитать тут:
http://community.borland.com/article/0,1410,25445,00.html
и тут:
http://www.ibase.ru/v6/ib6faq.htm#udf