Как я могу получить следующую информацию программно в C ++:
Это терминальная команда в Mac OSX:
ioreg -c IOPlatformExpertDevice | awk '/board-id/ {print $4}' | awk -F '\"' '{print $2}'
Я использую библиотеку IOKit для получения информации, такой как IOPlatformSerialNumber и PlatformUUID. Но я не смог найти соответствующий ключ для «Board-ID».
Если у вас есть io_service_t
обращаться к IOPlatformExpertDevice
в коде C ++ вы можете использовать IORegistryEntryCreateCFProperty()
функция для получения свойства «board-id». Ожидайте получить CFData
объект, но проверьте для нуля и правильный идентификатор типа, чтобы быть уверенным. Затем используйте обычный 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);
}
Других решений пока нет …