删除TDataModule但保持TADOConnection不变

时间:2014-01-28 14:07:24

标签: c++ dll ado c++builder-6 datamodule

我有一个与一些共享TADOConnection的TDataModule的lib。我在某些应用程序中创建和删除数据模块。

当我删除数据模块时,我收到EAccessViolation错误。我认为这是因为数据模块想要删除共享的TADOConnection。

我尝试在调用析构函数时将tdatamodule-> tbquery-> Connection属性设置为NULL,但没有任何运气。

为什么我认为错误存在于TADOConnection中?因为当我在没有lib的情况下构建应用程序时,我可以毫无问题地创建和删除数据模块。当我使用具有自己连接的数据模块创建一个lib时,我也没有问题。

有任何帮助吗?提前谢谢!

错误: http://oi60.tinypic.com/noyc6x.jpg

调用堆栈: http://oi61.tinypic.com/sgljx5.jpg

2 个答案:

答案 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
//---------------------------------------------------------------------------