Windows 中的错误 - DWORD (GetLastError) 与 HRESULT 与 LSTATUS

2024-03-26

我正在 Win32 + WTL 中进行一些编程,我对可用的错误类型感到困惑。

一般来说,我想检查错误,并将其提供给 AtlGetErrorDescription (它调用 FormatMessage)。

我的问题是:

  1. 有什么区别:

    • DWORD,由返回GetLastError.
    • HRESULT,由例如返回这CAtlFile包装器,它使用HRESULT_FROM_WIN32转换自DWORD.
    • LSTATUS,由例如返回RegCreateKeyEx.
  2. 我可以反馈哪些类型的错误FormatMessage?它的签名表明它接受HRESULT,但是有很多例子的返回值GetLastError被直接传递给FormatMessage.


它们只是反映了 Windows 中使用的不同 API:

  • GetLastError() 返回 winapi 错误代码。从 1 开始的简单数字。它们通常从底层本机 API 错误代码映射。就像 ERROR_FILE_NOT_FOUND 是从 STATUS_OBJECT_NAME_NOT_FOUND 文件系统驱动程序错误代码映射的。 Winapi 错误代码在 WinError.h SDK 头文件中声明。您可以使用 FORMAT_MESSAGE_FROM_SYSTEM 选项从 FormatMessage() 获取描述性字符串。

  • HRESULT 是 COM 错误代码。它由三个基本部分组成,高位表示严重性,中间位编码facility指示错误来源,低 16 位编码错误号。 HRESULT_FROM_WIN32() 宏是一个辅助宏,用于将 winapi 错误代码映射到 COM 错误代码。它只是将严重性设置为“失败”,将设施代码设置为 7 (winapi),并将错误代码复制到低位。可能的 COM 错误代码有很多,但只有少数可以通过 FormatMessage() 转换为字符串。您应该使用 ISupportErrorInfo 接口来询问 COM 服务器是否可以通过 IErrorInfo 提供错误的描述。

  • LSTATUS 晦涩难懂,RegCreateEx 实际上返回 LONG,只是 winapi 错误代码。它确实会在某些 shell 包装函数中弹出,例如 SHGetValue()。我常常很不清楚为什么 shell 团队会这样做。

  • 您的问题中没有提到,但值得注意的是本机 api 生成的错误代码。它们记录在 ntstatus.h SDK 标头中。 winapi 应该包装本机 api,但这些错误代码有时会在边缘出现,特别是在异常情况下。大多数程序员都见过 0xc0000005 (STATUS_ACCESS_VIOLATION) 异常代码。 0xc00000fd 与此站点的名称匹配。 FormatMessage() 可以将常见的错误代码转换为字符串,只要它不是由驱动程序生成的自定义错误代码。有多个 api 使用此类错误代码,即使它们在用户模式下运行也是如此。常见的例子是 WIC 和媒体基金会,否则没有强烈暗示他们为什么喜欢这种方式。获取此类错误代码的字符串需要使用带有 FORMAT_MESSAGE_FROM_HMODULE 选项的 FormatMessage。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 中的错误 - DWORD (GetLastError) 与 HRESULT 与 LSTATUS 的相关文章

  • Windows Server / Datacenter:设置 CPU 关联性 > 64 个核心

    SetThreadAffinityMask 允许为 64 个逻辑核心 处理器 设置关联掩码 但是 Windows Datacenter 最多可以有 64 个 CPU 每个 CPU 都有多个内核 请参阅here http social tec
  • 在 F# 中“合并”受歧视的联合?

    继从这个问题 https stackoverflow com questions 53506325 result vs raise in f async 我在组合不同类型时遇到问题Result类型在一起 以下是一个人为的示例 不是真实的代码
  • Windows下如何分配非分页内存

    当我使用 cudaHostAlloc 时 它将分配非分页 固定 页面锁定 内存 我想知道如何在没有 cuda 的情况下仅使用 Windows SDK 来做到这一点 None
  • 从 GetLastError() 函数返回的错误代码中获取文本

    我需要获取从 GetLastError 函数获得的错误代码的文本 我看到了一些示例 但我想要一个获取代码并返回字符串的函数 谢谢大家 我猜你想要这样的东西 DWORD dwLastError GetLastError TCHAR lpBuf
  • web请求超时处理?

    HttpWebRequest request HttpWebRequest WebRequest Create url request Timeout 20000 using WebResponse response request Get
  • PHP 构造函数返回 NULL

    我有这个代码 是否有可能User对象构造函数以某种方式失败 以便 this gt LoggedUser被分配了一个NULL构造函数返回后值和对象被释放吗 this gt LoggedUser NULL if SESSION verbiste
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • 将 PHP 错误处理程序限制为特定命名空间

    PHP 有没有办法只为特定的命名空间设置错误处理程序 我正在构建一个小型框架 我希望能够通过设置自定义错误处理程序并抛出异常来尝试捕获其名称空间内的所有错误 警告 通知消息 在此特定名称空间之外触发的错误应该以常规方式表现 用PHP可以完成
  • 链接到大地址感知 DLL

    假设我有一个使用 LARGEADDRESSAWARE 链接器标志集构建的 DLL 现在我有一个动态链接到该 DLL 的应用程序 这是否会使我的应用程序具有大型地址意识 如果不是 那么为任何 DLL 设置此标志是否有意义 讨论here htt
  • Windows.Automation 中的旧版 IAccessible

    如何使用C 获取AutomationElement的LegacyIAccessible State和其他LegacyIAccessibles 就像工具中的 Inspect exe 一样 The LegacyIAccessible是新的 并且
  • 在 C++ 程序中多次使用 FindWindows?

    我使用以下代码 C 来获取窗口 另一个应用程序 的句柄并向其中一个按钮发送消息以模拟单击 并且它可以正常工作 BOOL CALLBACK EnumChildProc HWND hwnd LPARAM lParam mdv test list
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功
  • 屏幕截图忽略了一些窗口

    我正在 MFC 中工作 我正在尝试捕获桌面的 bmp 我正在使用 GetDC NULL 来执行此操作 但它似乎忽略了特殊的皮肤窗口 它似乎忽略了用 UpdateLayeredWindow 绘制的窗口 此行为似乎仅发生在 Vista x64
  • WaitForSingleObject 是否充当内存屏障?

    昨天一个关于双重检查锁定的问题引发了一系列的想法 让我对一个简单的情况感到不确定 在下面的代码中 是否可以点击printf 不再同步 在这个简单的示例中 这些值可能位于同一缓存行上 因此我认为这种可能性较小 假设一开始可能性 gt 0 如果
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • 我可以在 C# 进程中使用 SetErrorMode 吗?

    我正在准备写一个在线法官核心 一个可以编译用户代码并运行程序来检查答案的程序 如uva online Judge 我在捕获提交程序的异常时遇到问题 如下所示 int main while scanf d d n m printf d n n
  • 在 try 中使用零合并运算符? for 抛出并返回可选值的函数

    我想在以下两种情况下使用 nil coalescing 运算符设置默认值 函数抛出错误 函数返回 nil 请看一下下面的代码片段 我有以下问题 为什么 item1 为零 item1和item2的初始化有什么区别 enum VendingMa
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和
  • 监控进程的网络使用情况?

    C 或 C C Win32 中有没有一种方法可以监视某个进程的网络使用情况 显然没有您构建的应用程序 我想只监视 1 个进程大约一个小时左右 然后返回仅该进程 例如 Limewire 使用的字节 是否可以 我知道 Windows 上的 ne
  • Win32 自定义绘制树视图控件

    我正在尝试使用 NM CUSTOMDRAW 消息自定义树视图控件 我只是想用灰色绘制所有其他可见的项目 这是绘制的代码 INT CResourceOutliner On WM NOTIFY HWND hDlg WPARAM wParam L

随机推荐