Проблема с DLL (COM-Сервера) c IBX компонентами внутри

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Проблема с DLL (COM-Сервера) c IBX компонентами внутри

Сообщение sdsfy » 23 сен 2009, 16:19

Приветствую коллег!

При переходе с IB 2007 Desktop на FB2.0 Embedded возникла следующая проблема:
Имеется приложение EXE шник, через TIBDatabase цепляется к файлу БД. Запускается из EXEшника DLL-ка, которая по такому же компоненту цепляется к файлу БД. Файлы правильные для каждого сервера. т.е. Залиты путем БакапРестора под каждый сервер.


Собственно сама проблема: В случае с FB, если в DLL-ке будет вызвано исключение по любому поводу или ошибка SQL-запроса, то Exe-шник более не выгружается из памяти. Хотя окно выгружает, но сам процесс не выгружается и в окне процессов остается. Надо его убивать принудительно. На IB 2007 да и на любом другом IB это го нет.

Кто-нибудь знает почему эта проблема проявляется на FB Embedded? Может есть что-то чего я не учел? Может надо как-то хитро отлавливать и обрабатывать исключительные ситуации и ошибки SQL?

Заранее всем откликнувшимся благодарен!



Однако, должен признаться, что заметил, что теперь и с IB2007 тоже самое... Никто не в курсе что может быть?
Последний раз редактировалось sdsfy 25 сен 2009, 01:12, всего редактировалось 1 раз.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: FB 2.0 Embedded + Delphi2007

Сообщение kdv » 23 сен 2009, 17:59

какие-то проблемы в dll. она должна транслировать exception в exe, собственно, вообще коннект из dll обычно работает "плохо", в том смысле что рекомендуют такие dll делать как package (пакет).

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: FB 2.0 Embedded + Delphi2007

Сообщение sdsfy » 23 сен 2009, 18:05

пока все в DLL работало через DBE к Interbase, все выгружалось. Именно с переходом на IBX возникли эти глюки. Стало быть DLL работает без проблем с компонентами BDE?

В любом случае, софту уже много лет и куча DLL. Переделать будет крайне сложно да и практически нереально...

По ходу проблема решилась вот как. Есть такой модуль IBSQLMonitoring, в нем лежит процедура DisableMonitoring. если ее вызвать до начала любых коннектов и иных операций с БД, то даже при ошибках работы с БД, прочих исключениях связанных с работой БД через компоненты IBX библиотека выгружается. Эта проблема с IBX известна и наиболее хорошо в англоязычных ресурсах освещена.

Пока буду тестировать, если что - отпишусь. И если все будет ок, переименуем тему, чтоб людям тоже польза при поисках была.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: FB 2.0 Embedded + Delphi2007

Сообщение kdv » 24 сен 2009, 14:22

Именно с переходом на IBX возникли эти глюки. Стало быть DLL работает без проблем с компонентами BDE?
Вы уже сами нашли причину в IBSQLMonitoring.
Эта проблема с IBX известна и наиболее хорошо в англоязычных ресурсах освещена.
спасибо за информацию, на русскоязычных форумах я такого не встречал. Впрочем, наверняка потому что коннект из ДЛЛ делают редко.

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: FB 2.0 Embedded + Delphi2007

Сообщение sdsfy » 24 сен 2009, 21:08

НА самом деле, там COM-Сервер упакованный в DLL. Но в любом случае, похоже правила IBX одинаковы и для COM и для простых DLL.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Проблема с DLL (COM-Сервера) c IBX компонентами внутри

Сообщение Dimitry Sibiryakov » 25 сен 2009, 12:56

Было бы удивительно, если бы правила отличались, поскольку COM-сервер это и есть простая DLL с некоторым предопределённым интерфейсом.

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: Проблема с DLL (COM-Сервера) c IBX компонентами внутри

Сообщение sdsfy » 25 сен 2009, 13:05

Dimitry Sibiryakov писал(а):Было бы удивительно, если бы правила отличались, поскольку COM-сервер это и есть простая DLL с некоторым предопределённым интерфейсом.
На сколько я понимаю, не обязательно чтоб COM - сервер находился внутри DLL. Он вполне может находиться и в Exe. DLL для COM - сервера экспортирует 4 небезызвестные функции. Собственно это и делает DLL носителем COM-Сервера. И на сколько я помню, DLL может носить только внутрипроцессные COM сервера, т.к. отдельного процессного потока создавать не в состоянии.

Но Возвращаясь к рассуждениям о проблемах с IBX, скорее всего надо говорить, что проблема не в COM а в DLL, поскольку эксперименты мои и коллег (наших и западных), опираются либо на чистые DLL либо на COM заключенных в DLL. О других проблемах IBX в COM (вне DLL) ничего не знаю.

Ответить