Если у вас есть io_service_t
ручка IOPlatformExpertDevice
в коде C++, вы можете использовать функцию IORegistryEntryCreateCFProperty()
, чтобы получить свойство «board-id». Ожидайте получить объект CFData
, но убедитесь, что он имеет значение null и правильный идентификатор типа. Затем используйте обычные методы CFData
для извлечения данных в нужную вам форму.
Если вы не получили IOService обрабатывать все же, вы должны быть в состоянии получить там, используя либо IOServiceGetMatchingService()
(я надеюсь, что это с уверенностью предположить, что будет только один экземпляр IOPlatformExpertDevice
.), Или с помощью IORegistryGetRootEntry()
, чтобы получить корень и ходящий график IORegistry на платформенное экспертное устройство с IORegistryEntryGetChildEntry()
или аналогичным.
Как board-id
свойства не имеет имя символической константы, вы просто должны жёстками его:
CFTypeRef board_id_property = IORegistryEntryCreateCFProperty(
platform_expert_device, CFSTR("board-id"), kCFAllocatorDefault, 0);
Обратите внимание, что значения свойств могут принимать различные типы, в том числе CFNumber
, CFBoolean
, CFString
, CFData
, CFArray
и CFDictionary
, и вам нужно быть готовым обработать случай, когда тип не соответствует ожидаемому, или когда возвращается NULL (если свойство не существует). Проверьте тип с помощью CFGetTypeID()
и т.д .:
if (board_id_property != NULL && CFGetTypeID(board_id_property) == CFDataGetTypeID())
{
CFDataRef board_id_data = (CFDataRef)board_id_property;
// safe to use CFData* functions now
...
CFRelease(board_id_property);
}
else
{
// Unexpected, do error handling.
...
if (board_id_property != NULL)
CFRelease(board_id_property);
}
как наименее крайнем случае, вы можете использовать 'трубу()' и командную строку из вашего вопроса. –
'popen()' уверенно? –
@MarkSetchell Извините, невнятно. –