Удалите TDataModule, но оставьте TADOConnection без изменений

0

У меня есть lib с некоторыми TDataModules, которые разделяют TADOConnection. Я создаю и удаляю datamodules в некоторых приложениях.

Когда я удаляю datamodule, я получаю ошибку EAccessViolation. Я думаю, это связано с тем, что датамодуль хочет удалить TADOConnection, который является общим.

Я попробовал установить для свойства tdatamodule-> tbquery-> Connection значение NULL при вызове деструктора без везения.

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

Любая помощь? Заранее спасибо!

Ошибка: http://oi60.tinypic.com/noyc6x.jpg

Стек вызова: http://oi61.tinypic.com/sgljx5.jpg

Теги:
dll
ado
c++builder-6
datamodule

2 ответа

0
Лучший ответ

Решение добавляет borlndmm.dll в папку проекта приложения, используя библиотеки или библиотеки dll.

Из проектов dll/lib в Borland C++ Builder:

//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------
0

TDataModule освобождает только то, что принадлежит ему. Если вы используете одно TADOConnection в нескольких экземплярах TDataModule они не могут все это использовать. Однако, возможно, вы освобождаете Владельца и не сообщаете другим экземплярам, что TADOConnection освобождается. У VCL есть механизм для этой цели - метод TComponent::FreeNotification(). Объекты TDataModule могут переопределить виртуальный метод Notification() а затем вызвать FreeNotification() в TADOConnection. Таким образом, если TADOConnection когда-либо освобождается, любой TDataModule который его использует, может действовать соответствующим образом, например, установив свой локальный указатель на NULL, чтобы они знали, что TADOConnection ушел.

  • 0
    Спасибо, что ответили. Проблема в том, что я не хочу удалять TADOConnection. Когда я удаляю модуль TDataModule, TADOConnection должен продолжать работать, так как он используется другими модулями данных. Предположим, у меня есть 3 TDataModules. 1 TDataModule имеет TADOConnection. Другие 2 TDataModules имеют TQueries и TDataSources, которые используют TADOConnection из первого модуля данных. Когда я удаляю один из последних 2 модулей данных, я получаю EAccess_Violation из первого модуля данных.
  • 0
    Пока первый DM не освобожден, TADOConnection не будет освобожден. Удаление запросов не освобождает соединение, которое они используют. Ваш AV связан с чем-то другим. Если вам нужно освободить первый DM, его нельзя установить в качестве владельца TADOConnection. Вы уже пытались отладить AV? Что говорит отладчик? Как выглядит стек вызовов, когда происходит AV?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню