`

Windows内核对象无效返回值——NULL或者INVALID_HANDLE_VALUE??

    博客分类:
  • C++
 
阅读更多
转自
http://blog.csdn.net/anycell/article/details/7343125

今天看《Windows核心编程》无意间看到内核对象创建函数返回值的一段内容。以前写程序判断句柄无效的时候没有多想,经常用NULL,有时也用INVALID_HANDLE_VALUE。跟我同样犯迷糊的朋友们也要注意了,两者不能混淆的!

      如果调用一个函数以便创建内核对象,但是调用失败了,那么返回的句柄值通常是0(NULL )。发生这种情况是因为系统的内存非常短缺,或者 遇到了安全方面的问题。不过有少数函数在运行失败时返回的句柄值是-1 (INVALID_HANDLE_VALUE)。例如,如果CreateFile未能打开指定的文件,那么它将返回INVALID_HANDLE_VALUE ,而不是返回NULL 。当查看创建内核对象的函数返回值时,必须格外小心。特别要注意的是,只有当调用CreateFile函数时,才能将该值与INVALID_HANDLE_VALUE 进行比较 。下面的代码是不正确的:

HANDLE hMutex = CreateMutex(...);
if (hMutex == lNVALID_HANDLE_VALUE)
{
    //We will never execute  this code because
    //CreateMutex returns NULL if it fails
}


HANDIE hFile = CreateFile(.. );
if (hFile == NULL} 
{
    //We will never execute  this code because CreateFile
    //returns lNVALID_HANDLE_VALUE (-1) if it fails.
}
分享到:
评论

相关推荐

    SeekBar GL_INVALID_VALUE 演示DEMO

    然而,在实际应用中,我们可能会遇到一些错误,比如"GL_INVALID_VALUE",这是一个与OpenGL相关的错误,通常表示传递给OpenGL函数的参数值无效。在本DEMO中,这个问题是由于在SeekBar的进度条(progress)设置中使用...

    INVALID_USER_KEY(解决方案).md

    INVALID_USER_KEY(解决方案).md

    Delphi判断文件是否正在被使用

    如果文件被其他进程占用,CreateFile将失败,返回INVALID_HANDLE_VALUE,此时IsFileInUse函数返回True,表示文件正在被使用;反之,如果成功打开,表示文件未被占用。 在实际应用中,还需要考虑到可能的错误处理,...

    STATUS_INVALID_IMAGE_HASH.zip

    在Windows操作系统中,STATUS_INVALID_IMAGE_HASH是一个错误代码,表示系统加载的模块(如动态链接库DLL或应用程序EXE)的数字签名不正确,或者是文件被篡改或损坏。这个错误可能会影响到浏览器的正常运行,例如...

    ORACLE常见问题及解决办法

    删除用户则使用`DROP USER`,但需注意,如果该用户拥有对象,需先将其所有对象删除或转交他人,例如: ```sql DROP USER username CASCADE; ``` 问题二:如何为用户授予和撤销权限? 权限的授予使用`GRANT`命令,如...

    旗联错误码1

    - 0x08MT_INVALID_READER_HANDLE指的是无效的读写器句柄,通常是因为初始化未完成或者读写器已被关闭。 - 0x09MT_HARDWARE_ALERT_ERR_BY_HIGN_RETURN_LOSS表示回波过高,可能是因为信号反射问题,需要调整天线位置或...

    ERR_INVALID_STATE(解决方案).md

    项目中碰到的,记录一下

    多任务编程---1 windows内核对象

    if (hThreadHandle == NULL || hThreadHandle == INVALID_HANDLE_VALUE) { // 创建失败,处理错误 } ``` #### 内核对象的句柄与使用计数 - **句柄**:每个内核对象都有一个唯一的句柄,该句柄是进程内部的一个...

    MFC 串口 自动查找串口号 C++ VS2019 编写

    程序里面CreateFile函数起了很大的作用,可以用来创建系统设备文件,如果该设备不存在或者被占用,则会返回一个错误 并于INVALID_HANDLE_VALUE 对比,据此可以判断可使用性。详细参见MSDN中的介绍。 如:if (m_hCom ...

    invalid_cache.csv

    invalid_cache.csv

    串口发送指令

    在VC++中,我们可以使用Windows API函数或者MFC(Microsoft Foundation Classes)库来实现串口通信。如果你是在修改别人的代码,那么你可能会遇到以下关键函数: 1. `CreateFile`:这是用来打开一个串口的API函数,...

    android Ble 蓝牙4.0 GATT 错误代码

    * GATT_INVALID_HANDLE (0x0001):表明处理无效。 * GATT_READ_NOT_PERMIT (0x0002):表明读取操作不被允许。 * GATT_WRITE_NOT_PERMIT (0x0003):表明写入操作不被允许。 * GATT_INVALID_PDU (0x0004):表明协议...

    c/c++ windows hid串口通信

    HDEVINFO device_info_set = INVALID_HANDLE_VALUE; int device_index = 0; HDEVINFO DeviceInfoSet; DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL); devinfo_data.cbSize = sizeof(SP_DEVINFO_...

    Windows多任务编程

    创建内核对象时,系统可能返回NULL或INVALID_HANDLE_VALUE,开发者需要正确判断创建是否成功,例如,通过检查句柄是否为NULL或INVALID_HANDLE_VALUE。 创建不同的内核对象,如线程、互斥量、信号量和事件,通常涉及...

    Chrome浏览器页面崩溃,STATUS_INVALID_IMAGE_HASH

    ( STATUS_INVALID_IMAGE_HASH )” 原因: Google在79版本(2019年12月20号左右)的更新中又重新启用了Renderer Code Integrity Protection(渲染器代码完整性保护),会阻止签名不是谷歌和微软的模块加载。该功能...

    打开vs提示invalid handle

    当Visual Studio报错“invalid handle”时,意味着程序尝试使用的句柄(handle)无效。在Windows操作系统中,句柄是用于标识进程、线程、文件、窗口等对象的标识符。当句柄被错误地创建、使用或释放时,就可能导致...

    c++ std::invalid_argument应用

    在C++编程中,`std::invalid_argument` 是一个异常类,用于表示当函数或方法接收到不合法或无效的参数时抛出的错误。这个类是`std::logic_error` 的子类,而`std::logic_error` 又是`std::exception` 的子类。`std::...

    enumeration_???_

    - 有时需要将枚举值转换为字符串,以便在调试时输出更易理解的信息,这可以通过查询OpenGL的字符串扩展或者第三方库实现。 5. **OpenGL枚举与C++枚举的区别**: - OpenGL枚举是库定义的,而C++枚举是语言级别的,...

    Multimedia MCI错误返回码详解(包括mciSendString)

    * MCIERR_INVALID_FILE:无效的文件 * MCIERR_NULL_PARAMETER_BLOCK:空参数块 * MCIERR_UNNAMED_RESOURCE:未命名的资源 * MCIERR_NEW_REQUIRES_ALIAS:新资源需要别名 * MCIERR_NOTIFY_ON_AUTO_OPEN:自动打开时...

    STATUS-INVALID-IMAGE-HASH

    标题中的"STATUS-INVALID-IMAGE-HASH"是一个错误代码,通常与浏览器遇到的不安全或损坏的图像资源有关。这个错误可能在Chrome和Edge等浏览器中出现,导致浏览器崩溃或无法正常显示网页内容。让我们深入了解一下这个...

Global site tag (gtag.js) - Google Analytics