gpt4 book ai didi

delphi - 外部异常 C0000006

转载 作者:行者123 更新时间:2023-12-03 14:34:15 28 4
gpt4 key购买 nike

我在 Delphi 中编写了一些程序,当我从 key 上的磁盘运行它时。在某些时候,我需要在应用程序运行时拔出 key 上的磁盘。如果我在一台至少有 1GB RAM 的计算机上执行此操作,则一切正常。当我在 512mb 的机器上执行此操作时,我收到外部异常 C0000006。如果我没记错的话,这是因为操作系统正在尝试读取下一行代码,但找不到它的资源(意味着应用程序未加载到 RAM),这是荒谬的,因为它是一个 500kb 的应用程序。

我该如何解决这个问题?或者至少以更优雅的方式处理这个异常? (因为我无法捕获它,因为它是外部异常)。

哦,我的 Delphi 应用程序是 Windows XP 下的控制台应用程序。

最佳答案

您需要做的是告诉Windows将整个程序加载到内存中,而不是让它在需要时要求加载页面。我已经成功地为通过 CD 运行的应用程序完成了此操作。我现在没有代码,但我记得我找到了如何在出色的开源安装程序 Inno Setup 的源代码中执行此操作的提示。

编辑:实际上,经过一些研究后,您可以使用 Delphi 编译器指令来告诉 Windows 加载完整的可执行文件。如果您使用的是 Delphi > 2006,则此方法有效。这将导致您永远不会遇到外部异常。

将此行放入您的应用程序项目文件中:

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

这告诉 Windows 将从可移动媒体使用可执行文件,因此将可执行文件加载到内存(或交换文件)中。那么你就不用担心像先把文件复制到机器上之类的事情了。

编辑 2:我目前可以访问 Delphi 7,并且正如其他人指出的那样,我可以确认这也适用于 Delphi 7(也可能是 Delphi 6),代码如下:

const
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400;

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

对于 Delphi < 6,您可以沿着强制将可执行文件分页的路径进行操作。有一个如何在 C++ 中执行此操作的示例 here (除非你找到一种方法在链接时间后修改PE头标志,这看起来很复杂)

N@

关于delphi - 外部异常 C0000006,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1317886/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com