Форум: "Базы";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
ВнизUDF Interbase Найти похожие ветки
← →
Pul (2004-01-15 13:38) [0]Подскажите пожалуйста, с какими настройками винды или с чем еще может быть связана следующая ошибка. Не найдена точка входа в UDF функцию. Причем на одном сервере работает без проблем, на другом не хочет. DLL-ка лежит в обоих случаях в одном и том же месте, декларация в базе есть, регистр в названиях одинаков. Ни с чем больше, кроме каких-то настроек винды или interbase сервера я связи не вижу. Используется Interbase Firebird.
← →
Johnmen (2004-01-15 13:41) [1]Для разных серверов разное расположение длл. Хотя здесь это, скорее всего, непричем...
А сервера разные ?
← →
Pul (2004-01-15 13:47) [2]>>Johnmen © (15.01.04 13:41) [1]
DLL-ка лежит в обоих случаях в одном и том же месте
Единственное различие, на одном Win2000SP3, на другом Win2000SP4
Может в этом связь?
← →
Digitman (2004-01-15 13:48) [3]комментарий из штатной док-ции к IB6
LANGUAGE REFERENCE 189
Beginning with InterBase 6, the rules for placing a library module have changed. It must meet one of the following criteria:
· It is located in ib_install_dir/UDF
· The complete pathname to the directory, including a drive letter in the case of a
Windows server, is listed in the InterBase configuration file.
Note that it is no longer sufficient to state a complete path name to the module in DECLARE
EXTERNAL FUNCTION. These changes have been implemented for security reasons.
← →
Digitman (2004-01-15 13:51) [4]
> Pul
DDL-скрипт при генерации GDB-файла один и тот же во всех случаях используется ? тот что единожды был создан ? или иначе ?
IBExpert фигурировал при создании скрипта ?
← →
Vlad (2004-01-15 13:52) [5]
> Pul (15.01.04 13:47) [2]
Если Windows2000 русский, то ни в коем случае не ставь 3-й сервиспак. Он причина многих бед.
У тебя вот это соблюдается ?
В Interbase 6 или Firebird библиотеки пользовательских функций (UDF) должны быть помещены в каталог UDF, или в каталог, определенный в файле конфигурации IBCONFIG (или isc_config на Unix) параметром EXTERNAL_FUNCTION_DIRECTORY. Это сделано по соображениям безопасности.
← →
Pul (2004-01-15 13:57) [6]>> Digitman © (15.01.04 13:51) [4]
Эту цитату я уже читал.
Я не использую скрипт для генерации GDB-файла, а просто делаю backup/restore одной и той же базы на обоих машинах.
При создании скрипта использовал
IBExpert или EMS QuickDesk, я уже не помню.
← →
Pul (2004-01-15 14:01) [7]>>Vlad © (15.01.04 13:52) [5]
Win2000 русский, но дело в том, что на 3-м сервиспаке работает, а на 4-м нет.
А EXTERNAL_FUNCTION_DIRECTORY установлен правильно.
Кстати, а резделителем между названием и значением параметра в IBCONFIG может быть как пробел, так и табуляция?
← →
Digitman (2004-01-15 14:51) [8]
> Pul
ты все-таки разыщи ориг.скрипт и приведи сюда точный фрагмент декларации проблемной UDF...
← →
Desdechado (2004-01-15 15:15) [9]ошибку выдает при restore или уже при работе с БД (запросы)?
← →
Pul (2004-01-15 15:34) [10]>>Digitman © (15.01.04 14:51) [8]
декларация проблемной UDF
DECLARE EXTERNAL FUNCTION ANKLIKE
BLOB,
CSTRING (32000),
FLOAT
RETURNS INTEGER BY VALUE
ENTRY_POINT "ANKLIKE" MODULE_NAME "ankudf.dll";
>>Desdechado © (15.01.04 15:15) [9]
при работе с БД
← →
Pul (2004-01-15 16:33) [11]ЭЙ!!! ОТЗОВИТЕСЬ!
← →
Desdechado (2004-01-15 17:12) [12]а другие UDF из этой DLL работают?
← →
kaif (2004-01-16 01:20) [13]
ENTRY_POINT "ANKLIKE"
Функция действительно в dll в верхнем регистре названа? Функции чувствительны к таким вещам.
А где она все же лежит? В \udf или в этой самой
EXTERNAL_FUNCTION_DIRECTORY ?
Попробуй объявить декларацию какой-нибудь стандартной функции из джентльменского набора в ib_udf.sql. Посмотри, ее тоже не удается вызвать?
← →
Digitman (2004-01-16 09:23) [14]если в UDF DLL соотв.ф-ция объявлена и экспортируется как
function ANKLIKE(Blob: PBlob; Str: PChar; var Dbl: Double): Integer; cdecl;
то при приведенном тобой ISQL-скрипте проблем с поиском ф-ции по эксп.имени быть не должно - и там и там имя ф-ции фигурирует в верхнем регистре
остается одно - сама DLL по какой-то причине не находится сервером
попробуй перенести на время DLL в ($WINDOWS)\System32
← →
Pul (2004-01-16 16:11) [15]>> Desdechado © (15.01.04 17:12) [12]
Она там всего одна
← →
Pul (2004-01-16 16:17) [16]>> kaif © (16.01.04 01:20) [13]
Функция действительно в dll в верхнем регистре названа!
Весь прикол в том, что на одном сервере работает без проблем, на другом не хочет. DLL лежит в \udf.
>> Digitman © (16.01.04 09:23) [14]
>> попробуй перенести на время DLL в ($WINDOWS)\System32
Уже пробовал, один и тот же результат.
← →
Desdechado (2004-01-16 16:28) [17]попробуй в декларации UDF сделать
MODULE_NAME "ankudf"
вместо
MODULE_NAME "ankudf.dll"
← →
Pul (2004-01-16 16:42) [18]>> Desdechado © (16.01.04 16:28) [17]
не помогает
← →
Pul (2004-01-16 16:47) [19]>> kaif © (16.01.04 01:20) [13]
стандартные функции из джентльменского набора работают
← →
Pul (2004-01-16 18:12) [20]ЭЭЭЭ----ЙЙЙЙ!!!!
← →
Digitman (2004-01-16 18:33) [21]
> Pul
хорошо.
сэмулируй ситуацию с загрузкой UDF в тестовом приложении :
hUDF := LoadLibrary("c:\Interbase\UDF\ankudf.dll
");
Win32Check(hUDF <> 0);
pFunc := GetProcAddress(hUDF, "ANKLIKE");
Win32Check(Assigned(pFunc));
о результатах извести
← →
Pul (2004-01-19 12:54) [22]>> Digitman © (16.01.04 18:33) [21]
Данный тестовый пример работает
← →
Digitman (2004-01-19 13:07) [23]1. закомментируй на время все ссылки на эту UDF в SP и триггерах, перекомпилируй эти SP/триггеры
2. удали из БД декларацию этой UDF, декларируй ее заново
3. раскомментируй ссылки на UDF в SP и триггерах, , перекомпилируй эти SP/триггеры,
попробуй что получилось
← →
Vlad (2004-01-19 13:09) [24]Между 2 и 3 неплохо бы еще сервер перезапустить
← →
Pul (2004-01-19 13:45) [25]>> Digitman © (19.01.04 13:07) [23]
Тот же результат.
← →
Digitman (2004-01-19 14:08) [26]
> Pul
после первого же отказавшего обращения IB-сервера к UDF DLL любой утилитой просмотри список модулей процесса IB-сервера
если среди них не присутствует модуль твоей UDF DLL, то проблема - в поиске самой DLL IB-сервером, в противном случае - проблема в ненахождении сервером в ней эксп.ид-ра ANKLIKE
← →
Pul (2004-01-19 15:10) [27]>> Digitman © (19.01.04 14:08) [26]
А чем объяснить тот факт, что стандартные функции нормально работают, а эта - нет, причем лежат эти DLL-ки в одной папке
← →
kaif (2004-01-19 15:20) [28]Проверь, нет ли путаницы русские/английски символы в имени dll. Например, буква "a" может быть русской (чья-то дурацкая шутка). Переименуй вообще эту dll к черту в MMM.DLL и продекларируй такую функцию. Для упрощения экспериментов создай отдельную маленькую базу данных. Без всяких триггеров и процедур.
В любом случае здесь какое-то недоразумение.
← →
Digitman (2004-01-19 15:28) [29]
> Pul (19.01.04 15:10) [27]
> А чем объяснить тот факт
есть еще одно страшное подозрение : твоя библ-ка находится сервером, но при попытке ее загрузки происходит отказ из-за отсутствия на машине неких библиотек, от которых зависит работа твоей библ-ки .. проверяй и разрешай все необходимые зависимости ... возможно твоя библ-ка требует наличия bpl-модулей, которых попросту и в помине нет на проблемной машине
← →
Digitman (2004-01-19 15:33) [30]к сож., ИБ-сервер (и его клоны) никак не извещают клиента об истинных причинах отказа при попытке задействовать внешнюю ф-цию во внеш.модуле .... "не найдено", мол, и все тут ... проверка зависимостей и путей поиска/загрузки требуемых модулей (пути поиска по умолчанию и пр.) - первое что надо было сделать в этой ситуации ...
← →
Digitman (2004-01-19 15:36) [31]что стоит в USES твоей библ-ки ? перечисли..
еще лучше, если полный текст проекта библ-ки небольшой, привести его сюда
← →
kaif (2004-01-19 16:42) [32]2 Digitman © (19.01.04 15:28) [29]
Но тестовое приложение с динамической загрузкой библиотеки, которое ты предложил, работает, как пишет автор вопроса. Если бы использовались какие-то dll, которых нет, то, ИМХО, тест бы не работал. А автор пишет, что тест работает. Конечно, стоит в любом случае с помощью tdump посмотреть все dll, которые использует эта dll. У меня был случай, когда по этой причине возникала подобная ошибка.
← →
Digitman (2004-01-19 16:51) [33]
> kaif © (19.01.04 16:42) [32]
не знаю... автор молчит ... темный лес пока .. с зависимостями
← →
Pul (2004-01-21 14:12) [34]Извините за дурацкий вопрос, напомните пож. параметры командной строки для tdump
← →
Vlad (2004-01-21 14:14) [35]tdump /?
← →
Pul (2004-01-21 14:22) [36]>> Vlad © (21.01.04 14:14) [35]
Я имел в виду параметры для просмотра библиотек, подключенных к приложению
(просто у меня необходимость подобной отладки возникала редко и я раньше пользовался другой прогой, дистрибутив которой я никак не могу найти)
← →
Vlad (2004-01-21 14:38) [37]
> Pul (21.01.04 14:22) [36]
> Я имел в виду параметры для просмотра библиотек, подключенных
> к приложению
Не поверишь, я имел ввиду тоже самое :-)
Читаем:
Syntax: TDUMP [options] [InputFile] [ListFile] [options]
Библиотеки, требуемые приложением увидишь в разделе Import
← →
Pul (2004-01-21 15:15) [38]>> Vlad © (21.01.04 14:38) [37]
спасибо, уже нашел.
Только я в указанном разделе не увидел библиотек с подключаемыми функциями, хотя стандартная фукнция ABS из ib_udf в запросах используется и нормально работает.
Это просто список импортируемых из DLL функций, а уж никак не список подключенных в данный момент.
← →
Pul (2004-01-21 15:19) [39]Vlad © (21.01.04 14:38) [37]
Вот почему я не люблю утилиты с командной строкой
← →
Digitman (2004-01-21 16:02) [40]
> Это просто список импортируемых из DLL функций, а уж никак
> не список подключенных в данный момент.
для получения инф-ции о процессах, использующих в дан.момент те или иные модули, можно воспользоваться иными существующими утилитами (просто поищи в сети)
в кр.случае можешь воспользоваться моим кодом
http://delphimaster.net/view/4-1074261583/
> Вот почему я не люблю утилиты с командной строкой
возьми из состава MS VisualStudio GUI-утилиту depends.exe - она работает и без ком.строки, т.к. подобно моему примеру (см.ссылку) встраивается в shell
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.011 c