我有一个我不能免费的数据模块(听起来很有趣)。无论我尝试手动销毁它,还是让另一个组件(甚至是Application)来帮我销毁它,我都会得到一个带有这个堆栈跟踪的AV:
exception class : EAccessViolation
exception message : Access violation at address 0048FC2B in module 'Instruments.exe'. Read of address 80808088.
main thread ($1e28):
0048fc2b Instruments.exe System.Classes TComponent.RemoveNotification
00408a01 Instruments.exe System 57 @Halt0
00ac86f0 Instruments.exe Instruments 82 initialization这个数据模块包含一组TADOxxx组件,外加两个TJvDataSource、一个TApplicationEvents、一个TClientDataSet和一个TJvAppDBStorage。它的代码只包含打开ADO连接、将几条记录写入表、运行几个查询等等(没有什么不寻常的)。除了我上面提到的,它不拥有任何其他组件。我不知道这个对RemoveNotificaion()的虚假电话是从哪里来的。有什么想法吗?
更新
删除TJvAppDBStorage后,我可以销毁数据模块。以下是组件的属性:
object AppStorage: TJvAppDBStorage
StorageOptions.BooleanStringTrueValues = 'TRUE, YES, Y'
StorageOptions.BooleanStringFalseValues = 'FALSE, NO, N'
DataSource = dsConfiguration
KeyField = 'Key'
SectionField = 'Section'
SubStorages = <>
ValueField = 'Value'
Left = 272
Top = 304
end有人用过JvAppDBStorage吗?这是正常和预期的行为吗?
发布于 2013-03-18 13:35:06
我没有使用JvAppDBStorage的经验,但我可以猜测发生了什么。
此组件将设置存储到数据库,这是由DataSource实例的JvAppDBStorage属性指定的。在您的例子中,这是dsConfiguration。因此,为了使所有这些都能工作,您需要dsConfiguration在AppStorage读取和写入设置时可用。我敢打赌,当dsConfiguration试图存储到它时,它已经被摧毁了。我希望当AppStorage被释放时会发生这种情况。因此,对这个问题的解释是,dsConfiguration在AppStorage之前被释放。
解决方案是确保dsConfiguration在释放AppStorage时仍然有效。
https://stackoverflow.com/questions/15476675
复制相似问题