c - 将 `HWND` 与 `INVALID_HANDLE_VALUE` 进行比较是错误的吗?

标签 c windows winapi

我和一位程序员同事进行了一场小辩论。他在他的代码中使用了以下习语:

HWND hWnd = SomeFunctionWhichReturnsAWindow();
if(hWnd != NULL && hWnd != INVALID_HANDLE_VALUE)
{
    // All good
}
else
{
    // Error
}

我告诉他在我看来这是一个错误的方法,因为 HWND 类型与 INVALID_HANDLE_VALUE 定义无关,但他确信这是好的代码,因为有效句柄永远不会等于 INVALID_HANDLE_VALUE,而且它的意思是“安全总比遗憾好”。

那么,这是一个可以接受的正确成语吗?

最佳答案

HWNDINVALID_HANDLE_VALUE 进行比较是错误的。虽然,在实践中,这不是一个会伤害你的错误。

CreateWindowEx 保留为无效的唯一 HWND 值是 NULL。现在,它恰好是一个实现细节,INVALID_HANDLE_VALUE 永远不可能是一个有效的 HWND,但这只是实现细节。生成窗口句柄的函数 CreateWindowEx 使用 NULL 来指示失败。这就是您需要知道的全部内容。

如果您想赢得与同事的争论,我建议您查看 SomeFunctionWhichReturnsAWindow 并找出调用了哪个 Win32 API 来生成 HWND。然后查阅文档。这将告诉您 NULL 是保留的无效值。

为了清晰起见,您绝对应该更改代码以单独针对 NULL 进行测试。

关于c - 将 `HWND` 与 `INVALID_HANDLE_VALUE` 进行比较是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26303039/

相关文章:

c - 在 C 中使用 calloc 的二维数组 unsigned char 中的段错误

c - 如何将 4 个字节的整数值存储在分配为 char 类型的 block 内存中

C - 下面程序中的指针是什么意思?

python - 在 Popen 中避免 shell=True

c - 简单的 OpenCL 随机生成器

c# - 如何在 C# 中从工作线程发布 UI 消息

c - C中的特权指令

c++ - wParam 为 0 时,什么时候会调用 WM_ENDSESSION?

multithreading - CopyFileEx 可以从辅助线程调用吗?

windows - 如何将窗口句柄传递给子进程?