【问题标题】:Getting External Exception C0000006 in D2006 app - how can I force delphi to load the whole executable?在 D2006 应用程序中获取外部异常 C0000006 - 如何强制 delphi 加载整个可执行文件?
【发布时间】:2011-08-01 22:49:52
【问题描述】:

退出我的应用程序时偶尔会出现这种情况 - 我的应用程序正在通过网络运行 EXE。我知道当部分 EXE 按需加载时,这是一个页面错误。

我还在 TDrawGrid 的 OnDrawCell 方法中观察到它,所以我很困惑它是如何导致页面加载的。此外,异常不断发生。

所以我的问题:

错误 C0000006 是否是由其他原因引起的?我对应用程序管理内存的方式进行了相当大的更改,尽管没有什么异常,而且我确信代码的行为正常。

如何让应用程序在启动时将其全部加载到内存中(在 Delphi 2006 中 - 我知道有用于更高版本的 Delphi 的指令)。

TIA

【问题讨论】:

  • External exception C0000006 的可能重复项
  • @大卫。是的,但这个问题给人的印象是你在 D2006 中无法做到这一点。
  • 我遇到了同样的问题。我必须在 Windows 7 Virtual PC 的“Windows XP Mode”上测试我的可执行文件。我这样做是因为我的计算机客户端有 XP-32,而我有 Seven-64。现在我知道这是因为我从 XP Mode 使用的虚拟同步磁盘执行它。我必须将文件夹复制到XP虚拟磁盘并执行它。

标签: delphi exception executable delphi-2006 page-fault


【解决方案1】:

指令$SetPEFlags 似乎是Delphi 2006 的一部分,至少Hallvard 在this article 在D2006 的上下文中谈到了它。看看here如何使用它。

【讨论】:

  • @大卫。很棒的文章。我在项目文件中添加了{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED + IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP},并从 8MB 可执行文件中减少了 370k。
  • @ross 你知道使用 IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 的含义吗?
  • 我昨天实际上在堆栈溢出时问了这个问题
【解决方案2】:

我们也经历过。系统将一些可执行页面放出进行交换,然后在一段时间后将其调回页面失败。这似乎与睡眠后恢复网络连接有关。

我们找到的唯一可行的解​​决方案是在本地机器上找到可执行文件。

【讨论】:

  • 谢谢@David。这是因为应用程序在启动后分配了一个合理的块。我见过有人提到修改 PE 标头标志,但这听起来很可怕。
【解决方案3】:

如果您的软件是从网络驱动器运行的,也经常会出现此异常 C0000006。为了防止这个问题,你可以结合标志

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

带有以下标志:

IMAGE_FILE_NET_RUN_FROM_SWAP = $0800;

{$SetPEFlags $0C00}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2017-11-08
    • 2011-04-25
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多