我接触的handle是在声明一个串口的时候,我发现 HANDLE hSerial
这行代码,我很疑惑,一般Qt里声明一个对象使用具体类型的,比如QSeialPort serial
这个样子,经过研究后发现以下
- HANDLE其实就是一个万能的通用类型,你可以用它声明任何变量,但是具体后续做什么取决于后续这个变量被存放什么资源
HANDLE hFile = CreateFile(...);
HANDLE hProcess = OpenProcess(...);
HANDLE hThread = CreateThread(...);
HANDLE hEvent = CreateEvent(...);
windows这样设计就是可以提供一个统一的接口来处理不同类型的资源,从而简化编程模型。
- 假如在头文件中声明一个 HANDLE 类型的变量(比如 HANDLE
hFile;),此时它只是一个未初始化的句柄,没有关联到任何具体的资源。可以将其视为一个占位符,等待后续的初始化和赋值。 当使用
CreateFile 或其他类似的函数将这个句柄初始化后,它就会关联到特定的资源,比如一个打开的文件。这时,hFile
变量就“注入了灵魂”,它的值将代表该资源的句柄。
hFile = CreateFile(L"example.txt", GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
在这个例子中,CreateFile 函数尝试打开名为 “example.txt” 的文件,并将文件的句柄赋值给
hFile。如果函数调用成功,hFile 就包含了指向该文件资源的句柄。
句柄实际上是一个指向内核对象的指针,而不是文件在文件系统中的物理地址。当通过 CreateFile
获得一个文件句柄时,操作系统会为您管理这个文件资源,确保可以通过这个句柄与文件进行交互,无论文件在磁盘上的实际位置如何变化。
即使文件系统进行了一些优化操作,比如移动文件以优化存储空间,句柄仍然有效,因为它指向的是文件的内核对象表示,而不是文件的物理位置。操作系统负责跟踪文件的实际位置,并确保所有的句柄都能正确地访问到文件数据。
- 当然,如果文件被删除或者句柄被关闭,那么该句柄就不再有效。在这种情况下,尝试使用该句柄进行操作将会导致错误。因此,在使用句柄时,需要确保它仍然有效,并且在不再需要时正确地关闭句柄,以释放系统资源。关闭句柄通常使用
CloseHandle(hFile);
这会告诉操作系统您已经完成了对该资源的使用,可以释放与该句柄关联的资源。在关闭句柄后,应该避免再次使用它,因为它已经不再有效。
- Handle声明的对象在构造函数里一般被赋值为INVALID_HANDLE_VALUE,表示一个无效句柄。
关于INVALID_HANDLE_VALUE,可以看看这篇文章:
INVALID_HANDLE_VALUE 、 NULL、nullptr 和 nullptr_t 的联系