如何在c ++中以编程方式检索以下信息:
这是Mac OSX中的终端命令:
ioreg -c IOPlatformExpertDevice | awk '/board-id/ {print $4}' | awk -F '\"' '{print $2}'
我使用IOKit库来检索IOPlatformSerialNumber和PlatformUUID信息等信息。但我找不到任何相应的“board-id”键。
答案 0 :(得分:2)
如果您的C ++代码中有io_service_t
IOPlatformExpertDevice
句柄,则可以使用IORegistryEntryCreateCFProperty()
函数获取“board-id”属性。期望接收CFData
对象,但检查null和正确的类型ID以确定。然后,使用通常的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);
}