Как прочитать тип собственности в IORegistry от IOKit? - PullRequest
1 голос
/ 17 июня 2019

Например, в следующем примере из документации IOKit каждая запись для этого устройства имеет разные типы, такие как Данные, Номер и т. Д.

Как я могу использовать IOKit , чтобы прочитать его тип? Я знаю, что мы можем использовать IORegistryEntryCreateCFProperties, чтобы создать словарь для записи, прочитать свойство как void pointer и привести его к типу, который нам известен, но как я могу узнать его тип, не просматривая его с помощью IORegistry Explorer?

enter image description here

1 Ответ

2 голосов
/ 17 июня 2019

Обратите внимание, что вы можете использовать аналогичную функцию IORegistryEntryCreateCFProperty для запроса только одного свойства, которое обычно более полезно, если вы на самом деле не пытаетесь создать что-то похожее на сам IORegistryExplorer и пока не делаете знать имена свойств, которые вы хотите проверить.

В обоих случаях это действительно сводится к основному вопросу. Вы заметите, что вместо действительно непрозрачного void*, IORegistryEntryCreateCFProperty() фактически возвращает CFTypeRef, и, аналогично, IORegistryEntryCreateCFProperties() обещает возвращать только объекты типа CoreFoundation в своем словаре. Это означает, что вы можете запросить тип объекта, используя CFGetTypeID(). Точное значение этого значения не имеет смысла, но его можно сравнить с идентификаторами типов для ожидаемого набора типов, например, CFStringGetTypeID() для CFString, CFDataGetTypeID() для CFData и т. Д.

Если вы используете Objective-C, вы можете также выполнить приведение к мосту и обработать значения свойств как NSObject - и затем узнать конкретный тип, например, с помощью. [object isKindOfClass:[NSString class]].

...