【问题标题】:Testing for an invalid windows handle: should I compare with 'NULL', '0' or even 'nullptr'?测试无效的窗口句柄:我应该与“NULL”、“0”甚至“nullptr”进行比较吗?
【发布时间】:2011-04-23 18:17:32
【问题描述】:

我来自一个背景,通常应该将指针与“NULL”进行比较,将整数与“0”进行比较。

由于我不认为 Windows 句柄是纯粹意义上的“指针”(即“句柄”),因此我养成了将它们与 0 而不是“NULL”进行比较的习惯。

显然它们现在在内部作为指针实现,但我个人认为这仅仅是为了获得一些类型安全,而不是因为它们本质上是指针。

无论如何,我刚刚注意到 CreateIC 返回 HDC 的帮助指出,如果函数失败,则返回“NULL”。

现在我很困惑 - 并且想知道其他人的看法 - 将 Windows 句柄视为指针是否更正确(因此对于现代编译器检查它是否与 'NULL' 或 'nullptr' 比较)还是应该算不算整数?

【问题讨论】:

  • 句柄不是指针,而是表的索引。有关返回值,请咨询 MSDN。无论如何,为什么if (x){.. 不好?
  • 感谢这个 - 称我为老式的,但我通常为评估为“布尔”结果的表达式保留“if (x)”表示法。我不知道这是好是坏,但我已经习惯了。

标签: c++ windows null handles


【解决方案1】:

将其与记录的错误返回值进行比较。这意味着您应该将它与 INVALID_HANDLE、0、-1、非零或 <=32 进行比较(我不是在开玩笑,请参阅 ShellExecute)。

【讨论】:

  • 感谢您的回答 - 我想您是对的,没有太多的一致性,我应该按照 MSDN 告诉我的去做。
【解决方案2】:

回答您的问题:HANDLE 类型在 winnt.h 中声明为

typedef PVOID HANDLE;

因此,从技术上讲,它是一个指针。

但是,我只会使用记录在案的任何内容;如果文档声明 NULL 被返回,我会使用它,除非有证据表明文档不正确。

我什至不考虑指针与整数。 NULL 只是一个不透明的值(在这种情况下),HANDLE 对我来说是一个不透明的类型,我不会费心查找它是什么 #define'd to。

【讨论】:

    【解决方案3】:

    我认为INVALID_HANDLE_VALUE 通常是 Windows 句柄的正确“无效”值...计算结果为 -1

    【讨论】:

    • 这并不总是正确的。这取决于你调用的是什么 API ......这是一个巨大的痛苦:(
    • 如果你这样做:HWND hwnd = INVALID_HANDLE_VALUE 你会得到一个编译时错误。这对我来说似乎很奇怪。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2013-09-07
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多