0

好的,我的应用程序完成了它应该做的所有事情,并且每次都做同样的事情,所以它好像测试已经过去了,没有那么麻烦。

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

错误类型是“地址违反访问”...

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

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

正如我所说,它甚至不会一直 100% 发生,而且它不是特定于机器的.. 在 3 台不同的 win xp 电脑上崩溃。

帮助!!

额外的; 发现我可以打开并运行该文件,只要我不在我创建的文件上弹出提示框,一切都很好。

4

4 回答 4

3

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

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

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

祝你好运!

于 2009-01-23T19:23:30.970 回答
1

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

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

于 2009-01-23T18:48:37.467 回答
-1

访问冲突很可能根本与打开的对话框无关。我强烈建议您查看您的代码并确保您没有覆盖内存边界 - 如果您使用动态数组检查并确保您没有访问其边界之外的元素;如果您手动分配内存,同样的事情。

如果您还没有使用 FastMM,请使用它。它有一些很好的内存完整性检查。

于 2009-01-23T21:44:58.593 回答
-2

我建议您将调试器附加到该进程,并找出导致程序崩溃的确切原因。应该让你开始......

于 2009-01-23T18:52:00.893 回答