我最近一直在阅读一些关于用 C++ 进行 Windows 编程的书籍,我对 WinAPI 中一些反复出现的概念有一些令人困惑的理解。例如,有很多以句柄关键字'H'开头的数据类型,这些应该像指针一样使用吗?但是还有其他以指针关键字“P”开头的数据类型。所以我猜不是。那么究竟是什么呢?为什么指向某些数据类型的指针首先被赋予单独的数据类型?例如,PCHAR 可以很容易地设计为 CHAR*?
2 回答
句柄曾经是 Windows 早期版本中的指针,但现在不再是。将它们视为“cookie”,一个允许 Windows 找回之前分配的资源的唯一值。就像 CreateFile() 返回一个新句柄一样,您稍后在 SetFilePointer() 和 ReadFile() 中使用它从同一个文件中读取数据。和 CloseHandle() 清理内部数据结构,同时关闭文件。这是一般模式,一个api函数创建资源,一个或多个使用它,一个销毁它。
是的,以 P 开头的类型是指针类型。是的,它们是多余的,如果您自己使用 * 也一样有效。实际上不确定为什么 C 程序员喜欢声明它们,我个人认为它会降低代码的可读性,我总是避免使用它们。但请注意复合类型,如 LPCWSTR,“指向常量宽字符串的长指针”。L 不再意味着任何东西,它可以追溯到 16 位版本的 Windows。但是指针、常量和宽很重要。我确实使用了那个 typedef,不这样做会冒未来可移植性问题的风险。这是这些 typedef 存在的核心原因。
句柄与指针相同,仅在两者都标识特定项目的情况下。显然,指针是项目的地址,因此如果您知道它的结构,您就可以开始获取项目中的字段。句柄可能是也可能不是指针 - 基本上,如果它是指针,您不知道它指向什么,因此您无法进入字段。
考虑句柄的最佳方式是,它是系统中某物的唯一 ID。当您将它传递给系统中的某个东西时,系统将知道将它转换为什么(如果它是指针)或如何处理它(如果它只是一些 id 或索引)。