如何从 IOKit 读取 IORegistry 中 属性 的类型?
How to read the type of a property in IORegistry from IOKit?
例如,在以下来自 IOKit documentation 的示例中,此设备的每个条目都有不同的类型,例如数据、数字等
如何使用IOKit读取它的类型?我知道我们可以使用 IORegistryEntryCreateCFProperties
为条目创建字典并将 属性 读取为 void pointer
并将其转换为我们知道的类型,但我怎么知道它的类型不使用 IORegistry Explorer 查看一下?
请注意,您可以使用类似的函数 IORegistryEntryCreateCFProperty
来仅查询一个 属性,这通常更有用,除非您实际上正在尝试构建类似于 IORegistryExplorer 本身的东西并且不还不知道您要检查的属性的名称。
在这两种情况下,这实际上归结为核心基础问题。您会注意到 void*
并不是真正不透明的 IORegistryEntryCreateCFProperty()
,而是 return 是 CFTypeRef
,同样地,IORegistryEntryCreateCFProperties()
承诺仅 return CoreFoundation-type 个对象在其字典中。这意味着您可以使用 CFGetTypeID()
. The exact value of this is meaningless, but it can be compared to the type IDs for the expected set of types, e.g. CFStringGetTypeID()
for CFString
, CFDataGetTypeID()
来查询对象的类型 CFData
等等。
如果您使用 Objective-C,您还可以执行桥接转换并将 属性 值视为 NSObject
- 然后使用例如找出特定类型[object isKindOfClass:[NSString class]]
.
例如,在以下来自 IOKit documentation 的示例中,此设备的每个条目都有不同的类型,例如数据、数字等
如何使用IOKit读取它的类型?我知道我们可以使用 IORegistryEntryCreateCFProperties
为条目创建字典并将 属性 读取为 void pointer
并将其转换为我们知道的类型,但我怎么知道它的类型不使用 IORegistry Explorer 查看一下?
请注意,您可以使用类似的函数 IORegistryEntryCreateCFProperty
来仅查询一个 属性,这通常更有用,除非您实际上正在尝试构建类似于 IORegistryExplorer 本身的东西并且不还不知道您要检查的属性的名称。
在这两种情况下,这实际上归结为核心基础问题。您会注意到 void*
并不是真正不透明的 IORegistryEntryCreateCFProperty()
,而是 return 是 CFTypeRef
,同样地,IORegistryEntryCreateCFProperties()
承诺仅 return CoreFoundation-type 个对象在其字典中。这意味着您可以使用 CFGetTypeID()
. The exact value of this is meaningless, but it can be compared to the type IDs for the expected set of types, e.g. CFStringGetTypeID()
for CFString
, CFDataGetTypeID()
来查询对象的类型 CFData
等等。
如果您使用 Objective-C,您还可以执行桥接转换并将 属性 值视为 NSObject
- 然后使用例如找出特定类型[object isKindOfClass:[NSString class]]
.