如何以编程方式检索 OS X board-id 信息

How to retrieve OS X board-id information programmatically

如何在 C++ 中以编程方式检索以下信息:

这是Mac中的一个终端命令 OSX:

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

我使用 IOKit 库来检索信息,例如 IOPlatformSerialNumber 和 PlatformUUID 信息。但是我找不到 "board-id".

的任何对应键

如果您的 C++ 代码中有 IOPlatformExpertDeviceio_service_t 句柄,您可以使用 IORegistryEntryCreateCFProperty() 函数获取 "board-id" 属性 .期望收到一个 CFData 对象,但要检查 null 和正确的类型 ID 以确保。然后,使用通常的 CFData 方法以您想要的形式提取数据。

如果您还没有 IOService 句柄,您应该可以使用 IOServiceGetMatchingService() 之一(我希望假设只有一个 IOPlatformExpertDevice 实例是安全的.),或使用 IORegistryGetRootEntry() 获取根,并使用 IORegistryEntryGetChildEntry() 或类似的方法将 IORegistry 图遍历到平台专家设备。

由于 board-id 属性 没有命名的符号常量,您只需对其进行硬编码:

CFTypeRef board_id_property = IORegistryEntryCreateCFProperty(
  platform_expert_device, CFSTR("board-id"), kCFAllocatorDefault, 0);

请注意,属性 值可以采用不同的类型,包括 CFNumberCFBooleanCFStringCFDataCFArrayCFDictionary,你需要准备好处理类型与你期望的不匹配的情况,或者当返回 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);
}