Как получить информацию об идентификаторе платы OS X программно

Как я могу получить следующую информацию программно в C ++:

Это терминальная команда в Mac OSX:

ioreg -c IOPlatformExpertDevice | awk '/board-id/ {print $4}' | awk -F '\"' '{print $2}'

Я использую библиотеку IOKit для получения информации, такой как IOPlatformSerialNumber и PlatformUUID. Но я не смог найти соответствующий ключ для «Board-ID».

2

Решение

Если у вас есть 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);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]