zl程序教程

您现在的位置是:首页 >  其它

当前栏目

为什么句柄返回值不一致?

为什么 返回值 一致 句柄
2023-09-14 09:10:45 时间

如果查看返回HANDLE的各种函数, 你就会发现其中一些返回NULL(例如CreateThread),而另一些会返回INVALID_HANDLE_VALUE(例如CreateFile)。所以,你必须查看相关的MSDN文档,才能确定函数在执行失败时的返回值的意义。

为什么句柄返回值如此不一致?

可能你早就猜到了:因为历史原因。

这些句柄的值被这样选择,主要是为了和16位Windows保持兼容。
16位函数OpenFile,_lopen和_lcreat在失败时返回-1,因此32位CreateFile函数返回INVALID_HANDLE_VALUE以便于从Win16移植代码。

(知道了这个,我们就应该可以回答这个问题您现在可以回答以下琐事问题:为什么我想打开一个文件时需要调用CreateFile? 不是应该调用OpenFile吗?答:当然可以,OpenFile是一个更好的名称,但是该名称已被使用。)

另一方面,对于CreateThread或CreateMutex,没有Win16对应的版本,因此它们返回NULL。

由于现在已经为不一致的返回值设置了先例,因此无论何时添加新函数,新函数是否返回NULL或INVALID_HANDLE_VALUE都有些麻烦。

这种不一致有多种后果

首先,当然,你必须小心检查正确的返回值。
其次,这意味着,如果编写通用的句柄包装类,则必须注意两个可能的”非句柄”值。
第三,如果要预初始化句柄变量,则必须以与要使用的功能兼容的方式对其进行初始化。例如,以下代码是错误的: