2

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

这是 Mac OSX 中的终端命令:

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

我使用 IOKit 库来检索 IOPlatformSerialNumber 和 PlatformUUID 信息等信息。但我找不到“board-id”的任何对应键。

4

1 回答 1

2

如果您在 C++ 代码中有io_service_t句柄,则可以使用该函数获取“board-id”属性。期望接收一个对象,但检查 null 和正确的类型 id 以确保。然后,使用通常的方法以您想要的形式提取数据。IOPlatformExpertDeviceIORegistryEntryCreateCFProperty()CFDataCFData

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

由于该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);
}
于 2016-07-29T20:21:55.623 回答