CreateFile能返回NULL吗?
Can CreateFile ever return NULL?
我知道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的有效性时,检查NULL
和INVALID_HANDLE_VALUE
。
但我不知道RAII与CreateFile
是否可以返回NULL
有什么关系。为了使HANDLE
与共享指针一起工作,您需要提供自定义代码来测试有效性和解除分配,因此您可以控制这些检查,而不是共享指针类。
换句话说,无论它是在共享指针中还是使用普通的HANDLE
,检查都是完全相同的,您必须以任何一种方式提供
CreateFile从不返回NULL
。我建议您使用已经创建的包装器ATL::CAtlFile
,不要基于shared_ptr
创建一个新的包装器。
相关文章:
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- fopen 在 gdb 中返回 NULL
- 为什么要从main()返回NULL?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 如何在C++中返回Null作为引用
- 从模板化函数返回Null对象
- 如何返回值为NULL的变量指针
- Windows 函数"GetCursorInfo"返回成功,但光标的句柄为 NULL
- GDALOpen 在 GEOTiff 文件上返回 null
- 将对象作为 null 返回内容
- QList<float* 类型的 NULL 返回值>
- 在用C++编写的COM客户端中引发异常的Null返回值
- nullptr初始值和WinAPI NULL返回
- DirectX pEnum->Next(1,&pPin,NULL) 返回S_FALSE