德尔福:哪个异常类应该用来引发最后的Win32 / Win64错误?

  • 在编写利用Windows API函数或某些Windows DLL函数(例如ntdll.dll)的函数/过程/方法时,应该使用哪个Delphi异常类来引发最后一个Win32 / Win64错误?

    从Delphi XE3文档引用System.SysUtils.EExternal引用:

    “注意: EExternal类表示Win32异常代码, ExceptionRecord成员指向Win32异常记录。”
  • 从这一点,我得出结论,Win32和Win64异常机制之间存在差异。 他们之间有什么不同?

  • 为了调试的目的 - 我的意思是关于堆栈框架相关的东西,差异是否导致每个平台的异常处理的不同代码实现?


  • 首先,我假设你的问题涉及Delphi,尽管有Free Pascal标签。 我将这一假设基于您引用Delphi文档的事实。

    应通过调用RaiseLastOSError将Windows API消息转换为异常。 这将引发EOSError 。 这是一个原生的Delphi异常。

    EExternalError异常是无关的。 当RTL将系统陷阱(例如访问冲突,数学错误等)转换为本机异常时,就是这样使用的。 请注意,Win32通常用于引用32位和64位Windows API。 实际上只有一个接口同时具有32位和64位两种版本。

    底层的异常处理模型在32位和64位Windows之间完全不同。 32位模型是基于堆栈的,64位模型是基于表格的。 这意味着异常处理和try / finally的实现在32位和64位体系结构之间完全不同。

    基于64位表模型的XE2中的原始实现具有大量故障。 我很高兴地说,在我和其他人提交了一些QC报告之后,XE3的实施得到了很大的改进。

    堆栈溢出不是进入这两种体系结构的异常处理ABI的底层细节的地方。 相反,我提供以下文章:

  • 关于Win32™结构化异常处理深度的速成课程
  • x64结构化异常处理
  • 链接地址: http://www.djcxy.com/p/91103.html

    上一篇: Delphi: Which exception class should be used to raise last Win32/Win64 errors?

    下一篇: Indy 10 Delphi FTP Client Demo Error