访问设备实例属性

在 Windows Vista 和更高版本的 Windows 中,应用程序和安装程序可以通过调用以下函数来访问属于统一属性模型的设备实例属性

注意

并非所有版本的 Windows 都支持 SetupApi。 如果可能,应使用较低层 API,例如通过 CfgMgr32.dll提供的 API。 有关提示 ,请参阅从 SetupApi 移植到 CfgMgr32

有关如何访问 Windows Server 2003、Windows XP 和 Windows 2000 上的设备属性的信息,请参阅使用 SetupAPI 和 Configuration Manager 访问设备属性

检索属性

属性 API(如 CM_Get_DevNode_PropertySetupDiGetDeviceProperty )可用于检索为设备实例设置的设备属性。 例如,下面是一个示例,该示例正在检索预期为 DEVPROP_TYPE_UINT32 类型的属性:

DEVPROPTYPE PropertyType = DEVPROP_TYPE_EMPTY;
ULONG PropertySize = 0;
ULONG SomeValue = 0;

PropertySize = sizeof(SomeValue);
cr = CM_Get_DevNode_Property(DevInst,
                             &DEVPKEY_CustomProperty,
                             &PropertyType,
                             (PBYTE)&SomeValue,
                             &PropertySize,
                             0);

if (cr == CR_NO_SUCH_VALUE) {
    printf("Property was not found\n");
} else if (cr != CR_SUCCESS) {
    printf("Error 0x%08x retrieving property.\n", cr);
} else if ((PropertyType != DEVPROP_TYPE_UINT32) || (PropertySize != sizeof(SomeValue))) {
    printf("Property data was not of the expected type or size\n");
} else {
    printf("Property value: 0x%08x\n", SomeValue);
}

设置属性

属性 API(如 CM_Set_DevNode_PropertySetupDiSetDeviceProperty )可用于设置设备实例的设备属性。 例如,下面是设置 DEVPROP_TYPE_UINT32 类型的属性的示例:

ULONG SomeValue = 5;
cr = CM_Set_DevNode_Property(DevInst,
                             &DEVPKEY_CustomProperty,
                             DEVPROP_TYPE_UINT32,
                             (PBYTE)&SomeValue,
                             sizeof(SomeValue),
                             0);

if (cr != CR_SUCCESS) {
    printf("Error 0x%08x setting property.\n", cr);
}

获取可用属性的列表

属性 API(如 CM_Get_DevNode_Property_KeysSetupDiGetDevicePropertyKeys )可用于检索设备属性键数组,这些键标识当前为设备实例设置的设备属性。 这可用于确定设备上设置的完整属性集。 但是,应谨慎使用这些函数,特别是随后检索这些函数指示在设备实例上设置的所有属性的值,因为检索所有属性及其值的列表可能是一项成本高昂的操作。