Delphi 我的应用程序中来自组件的非常奇怪的错误

Delphi 我的应用程序中来自组件的非常奇怪的错误,delphi,access-violation,save-dialog,Delphi,Access Violation,Save Dialog,好的,我的应用程序做了它所需要做的一切,它每次都做同样的事情,所以它不像测试那样麻烦 它“有时”会崩溃,但并不总是如此。当我将鼠标悬停在最近输出的“打开文件”对话框中的一个文件上时,它就会这样做。它不会立即等待大约半秒到一秒,我知道那是openfiledialog显示文件大小等数据的时候,它是在什么时候创建的,它是什么类型的文档..(标准)鼠标悬停信息。。问题是这是使用“opendialog”,我没有写这段代码,所以这个错误不是我造成的,是吗??????如果是,如果不是,我该怎么做才能阻止它 错

好的,我的应用程序做了它所需要做的一切,它每次都做同样的事情,所以它不像测试那样麻烦

它“有时”会崩溃,但并不总是如此。当我将鼠标悬停在最近输出的“打开文件”对话框中的一个文件上时,它就会这样做。它不会立即等待大约半秒到一秒,我知道那是openfiledialog显示文件大小等数据的时候,它是在什么时候创建的,它是什么类型的文档..(标准)鼠标悬停信息。。问题是这是使用“opendialog”,我没有写这段代码,所以这个错误不是我造成的,是吗??????如果是,如果不是,我该怎么做才能阻止它

错误类型为“地址处的访问冲突”bla

“打开文件”对话框没有过滤器,与组件托盘上的完全相同,在我调用“opendialog.execute”后崩溃

我最初认为它可能仍然在写入,但在我停止应用程序打开任何新文件,直到最后一个文件完成保存过程后,它才继续

正如我所说,这种情况并非总是100%发生,而且它不是特定于机器的。。在3台不同的win xp pc上崩溃

救命


附加的;结果我可以打开并运行文件,只要我没有在我创建的文件上弹出提示框,一切都很好。

打开文件对话框基本上是一个资源管理器实例。这意味着您安装的每个shell扩展也会被加载。这样做的一个问题是,一旦使用“打开文件”对话框,每个shell扩展都会使用堆栈来存储变量/返回地址。。。 如果堆栈不够大,则可能导致崩溃


尝试增加应用程序的堆栈大小。

我建议您在进程中附加一个调试器,并找出到底是什么导致程序崩溃。应该开始…

在表单上放置一个TApplicationEvents组件,并为OnHint事件添加一个事件处理程序。然后在那里放一个断点,看看你是否能在它崩溃之前打破它(正如你所说,当它试图显示提示时,听起来好像它崩溃了)。然后,您可以使用debug DCU进行编译,并在中进行跟踪,查看它崩溃的原因

我猜你仍然有一个文件句柄,可能在文件上有一个独占锁。检查文件句柄并确保正确关闭它们。如果在程序运行时尝试从记事本打开其中一个文件,会发生什么情况

间歇性行为可能与导致文件句柄泄漏的错误条件下的不同代码路径有关


祝你好运

访问冲突很可能与打开的对话框完全无关。我强烈建议您检查代码,确保没有写过内存边界——如果您使用的是动态数组,请检查并确保您没有访问超出其边界的元素;如果手动分配内存,情况也是如此


如果您尚未使用FastMM,请使用它。它有一些很好的内存健全性检查。

有趣的是,我从未想过这一点。在这种情况下,这将是堆栈溢出,而不是访问冲突。只有当所有扩展都同时执行时,才会耗尽堆栈。他们不是。shell分别运行每一个线程。堆栈溢出可能导致任何类型的崩溃,包括访问冲突。shell在多个线程中运行扩展-至少在Vista上,甚至(程度更低)在XP上。就像我说的,在我点击文件或按enter键或open键之前,它会在提示下崩溃。我不确定我是否100%理解你,Jim,我在applicationevent组件的“onhint”上添加了一个断点。但什么都没有发生。我是不是很愚蠢?是的,我现在100%知道是提示还是在提示发出时发生的,因为如果我太快或使用箭头键,我不会出错。仍然不知道为什么,但我现在想禁用提示。检查你的文件句柄。确保你没有泄漏一个。如果你用记事本打开文件,或者在资源管理器中将鼠标放在上面,会发生什么?好吧,它在记事本中打开时没有任何提示。不,亚瑟,你不想禁用提示。您希望修复程序中导致提示中断的错误。不要把问题掩盖起来,否则你只会得到一张笨重的地毯。