【发布时间】:2014-12-05 20:05:07
【问题描述】:
我和一位程序员同事进行了一场小辩论。他在代码中使用了以下成语:
HWND hWnd = SomeFunctionWhichReturnsAWindow();
if(hWnd != NULL && hWnd != INVALID_HANDLE_VALUE)
{
// All good
}
else
{
// Error
}
我告诉他,在我看来这是错误的方法,因为HWND 类型与INVALID_HANDLE_VALUE 定义无关,但他确信这是好的代码,因为有效的句柄永远不会相等到INVALID_HANDLE_VALUE,它的心情是“比抱歉更安全”。
那么,这是一个可以接受且正确的成语吗?
【问题讨论】:
-
错误是一个大词。但可以肯定的是,窗口句柄永远不会有那个值,它只用于 kernel32 句柄。
-
@HansPassant 在实践中是的,但这不只是一个实现细节吗?
-
如果您查看返回 HANDLE 的各种函数,您会发现其中一些返回 NULL(如 CreateThread),其中一些返回 INVALID_HANDLE_VALUE(如 CreateFile)。您必须检查文档以查看每个特定功能在失败时返回的内容。由于历史原因,返回值是如此不一致。选择这些值是为了与 16 位 Windows 兼容。 16 位函数 OpenFile、_lopen 和 _lcreat 在失败时返回 -1,因此 32 位 CreateFile 函数返回 INVALID_HANDLE_VALUE 以便于从 Win16 移植代码。