如何从IOKit读取IORegistry中属性的类型?

时间:2019-06-17 18:39:40

标签: macos core-foundation iokit

例如,在以下来自IOKit documentation的示例中,此设备的每个条目都具有不同的类型,例如数据,数字等

如何使用 IOKit 读取其类型?我知道我们可以使用IORegistryEntryCreateCFProperties为条目创建字典,并将属性读取为void pointer并将其强制转换为我们知道的类型,但是我如何不看一下就知道它的类型使用IORegistry Explorer?

enter image description here

1 个答案:

答案 0 :(得分:2)

请注意,您可以使用类似的函数IORegistryEntryCreateCFProperty来仅查询一个属性,除非您实际上正在尝试构建类似于IORegistryExplorer本身并且尚不知道其名称的属性,否则通常更有用。您要检查的属性。

在两种情况下,这实际上都归结为Core Foundation问题。您会注意到,void*不是真正的不透明IORegistryEntryCreateCFProperty(),而是实际上返回了CFTypeRef,同样,IORegistryEntryCreateCFProperties()承诺仅在其字典中返回CoreFoundation类型的对象。这意味着您可以使用CFGetTypeID()查询对象的类型。确切的值是没有意义的,但是可以将其与预期类型集的类型ID相比较,例如CFStringGetTypeID()代表CFStringCFDataGetTypeID()代表CFData,依此类推。

如果您使用的是Objective-C,还可以执行桥接强制转换并将属性值视为NSObject-然后使用例如来查找特定类型。 [object isKindOfClass:[NSString class]]