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