在编写使用Windows API函数或某些Windows DLL函数(例如ntdll.dll)的函数/过程/方法时,应该使用哪个Delphi异常类来引发最后的Win32 / Win64错误?
引自Delphi XE3文档关于System.SysUtils.EExternal:
“注意:EExternal
类代表Win32异常代码。ExceptionRecord
成员指向 Win32 异常记录。”
从那时起,我得出结论,Win32和Win64异常机制之间存在差异。它们之间有什么区别?
出于调试目的 - 我的意思是关于堆栈帧相关的东西 - 差异是否导致每个平台的异常处理的代码实现不同?
答案 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的低级细节的地方。相反,我提供以下文章: