外部异常C0000006

21 delphi error-handling windows-xp exception

我在Delphi中编写了一些程序,当我从密钥上的磁盘运行它时.在某些时候,我需要在应用程序运行时拔掉密钥上的磁盘.如果我在一台至少有1GB内存的计算机上这样做,一切都还可以.当我在512mb的机器上执行此操作时,我得到一个外部异常C0000006.如果我没有弄错,这是因为操作系统正在尝试读取下一行代码,但无法找到它的资源(意思是,应用程序没有加载到ram),这是荒谬的,因为它是一个500kb的应用程序.

我怎么解决这个问题?或者至少以更优雅的方式处理这个例外?(因为我不能抓住它,因为它是一个外部异常).

哦,我的Delphi应用程序是windows xp下的控制台应用程序.

Nat*_*Nat 37

你需要做的是告诉windows将你的整个程序加载到内存中,而不是让它在需要时要求加载页面.我已成功完成了运行CD的应用程序.我现在没有代码跟我一起,但我记得我发现了如何在源代码中为奇妙的开源安装程序Inno Setup找到它的提示.

编辑:实际上,经过一些研究,您可以使用Delphi编译器指令告诉Windows加载完整的可执行文件.如果您使用Delphi> 2006,这将起作用.这将导致您永远不会获得外部异常.

将此行放在应用程序项目文件中:

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
Run Code Online (Sandbox Code Playgroud)

这告诉Windows将从可移动介质中使用可执行文件,因此将可执行文件加载到内存(或交换文件)中.然后,您不必担心首先将文件复制到计算机等等.

编辑2:我目前可以访问Delphi 7,我可以确认,正如其他人所说,这也适用于Delphi 7(可能是Delphi 6),代码如下:

const
  IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400;

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
Run Code Online (Sandbox Code Playgroud)

对于德尔福<6,你可以去迫使被寻呼的可执行文件的路径,还有就是如何做到这一点在C++的例子在这里(除非你找到一个方法来修改链接时后的PE头标志,看起来变得复杂)

N - [


Bar*_*lly 17

那是EXCEPTION_IN_PAGE_ERROR.这意味着OS加载程序无法分页运行应用程序所需的某些数据,可能是由于I/O错误或其他错误.由于你要删除磁盘,这是有道理的.

也许允许应用程序的工作集(常用内存页面集)在1GB机器上增长得足够大,这样就不需要求助于磁盘来重新加载页面,但512MB机器上并非如此. ?

我建议尝试将可执行文件复制到临时位置并从那里开始,可能会延迟删除; 或者使用一些其他机制来保证正常使用中应用程序触及的所有内存页面的磁盘后备,并在内存压力的情况下防止此错误,其中操作系统将修剪正在运行的进程的工作集.

  • winbase.h中的EXCEPTION_代码; 它们通常是来自winnt.h的相应NTSTATUS代码的同义词. (5认同)