CreateFile能返回NULL吗?

Can CreateFile ever return NULL?

本文关键字:NULL 返回 CreateFile      更新时间:2023-10-16

我知道CreateFile返回的无效值是INVALID_HANDLE_VALUE。但因为我也喜欢使用RAII,这是非常诱人的,只是坚持在一个shared_ptr柄(像这样:shared_ptr<void> handle (CreateFile(args),&CloseHandle))确保把手合上了。我唯一关心的是这种快速简便的方法来做RAII是如果CreateFile可以返回NULL作为句柄值。

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

Raymond Chen写了一篇关于这个主题的博客文章:为什么HANDLE的返回值如此不一致?

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

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

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

换句话说,无论它是在共享指针中还是使用普通的HANDLE,检查都是完全相同的,您必须以任何一种方式提供

CreateFile从不返回NULL。我建议您使用已经创建的包装器ATL::CAtlFile,不要基于shared_ptr创建一个新的包装器。