gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:48:35 25 4
gpt4 key购买 nike

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

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

    "Note: EExternal classes represent Win32 exception codes. The ExceptionRecord member points to a Win32 exception record."
  2. 从这一点上,我得出结论,Win32 和 Win64 异常机制之间存在差异。它们之间有什么区别?

  3. 出于调试目的(我的意思是与堆栈帧相关的内容),这些差异是否会导致每个平台的异常处理代码实现不同?

最佳答案

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

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

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

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

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

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

关于Delphi:应使用哪个异常类来引发最后的 Win32/Win64 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com