我有一个与一些共享TADOConnection的TDataModule的lib。我在某些应用程序中创建和删除数据模块。
当我删除数据模块时,我收到EAccessViolation错误。我认为这是因为数据模块想要删除共享的TADOConnection。
我尝试在调用析构函数时将tdatamodule-> tbquery-> Connection属性设置为NULL,但没有任何运气。
为什么我认为错误存在于TADOConnection中?因为当我在没有lib的情况下构建应用程序时,我可以毫无问题地创建和删除数据模块。当我使用具有自己连接的数据模块创建一个lib时,我也没有问题。
有任何帮助吗?提前谢谢!
答案 0 :(得分:0)
TDataModule
只释放它拥有的东西。如果您在多个TADOConnection
个实例中共享一个TDataModule
,那么他们就不能拥有它。但是,也许您释放所有者并且不通知其他实例TADOConnection
被释放。 VCL有一个用于此目的的机制 - TComponent::FreeNotification()
方法。您的TDataModule
个对象可以覆盖虚拟Notification()
方法,然后在FreeNotification()
上调用TADOConnection
。这样,如果TADOConnection
被释放,则使用它的任何TDataModule
都可以相应地执行操作,例如将其本地指针设置为NULL,以便他们知道TADOConnection
已消失。
答案 1 :(得分:0)
解决方案是使用库或dll将borlndmm.dll
添加到应用程序的项目文件夹中。
来自Borland C ++ Builder中的dll / lib项目:
//---------------------------------------------------------------------------
// 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's 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
//---------------------------------------------------------------------------