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

    从关于System.SysUtils.EExternal的 Delphi XE3 文档中引用:

    “注意:EExternal类代表 Win32 异常代码。ExceptionRecord成员指向Win32异常记录。”
  2. 从这一点,我得出结论,Win32和Win64的异常机制是有区别的。它们之间有什么区别?

  3. 出于调试目的——我的意思是关于堆栈帧相关的东西——差异是否会导致每个平台的异常处理的代码实现不同?

4

1 回答 1

6

首先,我假设您的问题与 Delphi 有关,尽管有 Free Pascal 标签。我的假设是基于您引用 Delphi 文档的事实。

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

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

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

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

Stack Overflow 不是深入探讨这两种架构的异常处理 ABI 的底层细节的地方。相反,我提供以下文章:

于 2012-10-14T07:53:03.403 回答