CreateFile可以返回NULL吗?

时间:2011-11-23 10:31:45

标签: c++ windows winapi

我知道CreateFile返回的无效值是INVALID_HANDLE_VALUE。但是既然我也喜欢使用RAII,那么将HANDLE放在shared_ptr中是非常诱人的(像这样: shared_ptr<void> handle (CreateFile(args),&CloseHandle)) 确保手柄已关闭。 我唯一担心这种快速简便的RAII方法是CreateFile可以返回NULL作为HANDLE值。

3 个答案:

答案 0 :(得分:6)

NULL不是有效的句柄值。您可以从某些Windows API函数返回NULL以指示失败的事实中辨别出这一点。由于只有一个函数来处理句柄CloseHandle,因此NULL不是有效的HANDLE值。因此,CreateFile无法返回NULL

Raymond Chen写了一篇关于这个主题的博客文章:Why are HANDLE return values so inconsistent?

现在,我对shared_ptr<>一无所知,所以不想评论你的想法是否合适。我只是回答你提出的直接问题。

答案 1 :(得分:1)

以通用方式测试HANDLE的有效性时,请检查NULLINVALID_HANDLE_VALUE

但我不知道RAII与CreateFile是否可以返回NULL有什么关系。您需要提供用于测试有效性和解除分配的自定义代码,以使HANDLE能够使用共享指针,因此您可以控制这些检查,而不是共享指针类。

换句话说,它是在共享指针中还是使用普通HANDLE没有区别,检查完全相同,你必须以任何一种方式提供它们。

答案 2 :(得分:0)

CreateFile永远不会返回NULL。我建议您使用已创建的包装器ATL::CAtlFile,并且不要基于shared_ptr创建新包装器。