2016-07-29 11 views
2

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

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

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

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

+0

как наименее крайнем случае, вы можете использовать 'трубу()' и командную строку из вашего вопроса. –

+1

'popen()' уверенно? –

+1

@MarkSetchell Извините, невнятно. –

ответ

1

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

У меня есть io_service_t дескриптор, но нет ключа для «board-id», так как есть один для kIOPlatformSerialNumberKey. –

+0

Это просто строка, которая, кажется, жестко закодирована в различных битах исходного кода OS X без символической константы. Вам просто нужно использовать необработанную строку. – pmdj

+0

Итак, я попробовал то, что вы предложили, используя исходную строку. Следующие 2 попытки потерпели неудачу с ошибкой "- [__ NSCFData _fastCharacterContents]: непризнанный селектор, отправленный в экземпляр ...": IORegistryEntryCreateCFProperty (платформаExpert, CFSTR ("board-id"), kCFAllocatorDefault, 0) & IORegistryEntryCreateCFProperty (platformExpert, CFSTR ("производитель"), kCFAllocatorDefault, 0). Тем не менее, IORegistryEntryCreateCFProperty (platformExpert, CFSTR («IOPolledInterface»), kCFAllocatorDefault, 0) преуспевает. Когда вы запускаете команду терминала ioreg -rd1 -c IOPlatformExpertDevice, существует разница в наименовании этих переменных. –

 Смежные вопросы

  • Нет связанных вопросов^_^