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

时间:2012-10-14 07:41:42

标签: delphi freepascal

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

    引自Delphi XE3文档关于System.SysUtils.EExternal

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

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

1 个答案:

答案 0 :(得分:6)

首先,我假设您的问题涉及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中的原始实现具有大量故障。我很高兴地说,在我和其他人提交的一些质量控制报告之后,XE3的实施得到了很大改善。

Stack Overflow不是进入这两种体系结构的异常处理ABI的低级细节的地方。相反,我提供以下文章: