德尔福:哪个异常类应该用来引发最后的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的底层细节的地方。 相反,我提供以下文章:
上一篇: Delphi: Which exception class should be used to raise last Win32/Win64 errors?