我有一个lib,其中一些tdatamodules共享artoconection。我在某些应用程序中创建并删除数据模块。
当我删除Datamodule时,会遇到一个Eaccessviolation错误。我认为这是由于数据模块要删除tadoconnection的事实,该toconnection被共享。
我尝试将tdatamodule-> tbquery->连接属性设置为destructor时,无运气。
。为什么我认为错误存在于t型连接中?因为当我在没有LIB的情况下构建应用程序时,我可以在没有任何问题的情况下创建和删除数据模块。当我使用具有自己连接的数据符号创建一个lib时,我也没有问题。
有帮助吗?预先感谢!
错误:http://oi60.tinypic.com/noyc6x.jpg
呼叫堆栈:http://oi61.tinypic.com/sgljx5.jpg
TDataModule
仅释放其拥有的东西。如果您在多个TDataModule
实例中共享一个TADOConnection
,则他们不能全部拥有它。但是,也许您正在释放所有者,并且没有通知其他实例正在释放TADOConnection
。VCL具有用于此目的的机制-TComponent::FreeNotification()
方法。您的TDataModule
对象可以覆盖虚拟Notification()
方法,然后在TADOConnection
上调用FreeNotification()
。这样,如果TADOConnection
曾经释放过,那么使用它的任何TDataModule
都可以采取相应的作用,例如将本地指针设置为null,因此他们知道TADOConnection
已消失。
解决方案正在使用库或dll添加borlndmm.dll
。
来自Borland C 建造者的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
//---------------------------------------------------------------------------