DevGetObjectProperties 函数 (devquery.h)

同步检索指定对象的一组属性

语法

HRESULT DevGetObjectProperties(
  [in]  DEV_OBJECT_TYPE      ObjectType,
  [in]  PCWSTR               pszObjectId,
  [in]  ULONG                QueryFlags,
  [in]  ULONG                cRequestedProperties,
  [in]  const DEVPROPCOMPKEY *pRequestedProperties,
  [out] PULONG               pcPropertyCount,
  [out] const DEVPROPERTY    **ppProperties
);

参数

[in] ObjectType

一个来自 DEV_OBJECT_TYPE 的值,用于确定要检索其属性的对象的类型。

[in] pszObjectId

要为其检索属性的对象标识。

[in] QueryFlags

使用按位 OR 运算组合的 DEV_QUERY_FLAGS 值。 将 DevQueryFlagUpdateResults 或 DevQueryFlagAsyncClose 传递给此函数无效。

[in] cRequestedProperties

pRequestedProperties中提供的 DEVPROPCOMPKEY 结构的数目。 如果指定了 devQueryFlagAllProperties ,则必须将其设置为 0。

[in] pRequestedProperties

提供 DEVPROPCOMPKEY 结构数组,这些结构指定应为指定对象检索的属性。

DEVPROPCOMPKEY 结构的 LocaleName 字段将被忽略,必须设置为 NULL。

如果 cRequestedProperties 为 0,则必须为 NULL。

[out] pcPropertyCount

ppProperties中返回的 DEVPROPERTY 结构的数目。

[out] ppProperties

接收 DEVPROPERTY 结果的新分配数组的指针。 调用方必须使用 DevFreeObjectProperties释放指针。

返回值

如果函数成功计算了搜索条件并返回匹配对象,则返回S_OK;否则为适当的错误值。

言论

此函数是一种在给定对象类型和标识的情况下从对象同步检索一组属性的有效方法。 返回的属性数组必须使用 DevFreeObjectProperties释放。 如果请求的属性不存在,ppProperties 仍将包含该属性的条目,但该条目的类型为 DEVPROP_TYPE_EMPTY

以下示例演示如何调用 DevGetObjectProperties 来检索一组请求的属性,然后调用 DevFindProperty,以在 DEVPROPERTY 结构的数组中查找特定属性。

void
Example1(PCWSTR DeviceInstancePath)
{
    HRESULT hr = S_OK;
    const DEVPROPERTY* TempProperty = NULL;
    ULONG PropertyCount = 0;
    const DEVPROPERTY* PropertyList = NULL;
    DEVPROPCOMPKEY RequestedProperties[] =
    {
        { DEVPKEY_Device_HardwareIds, DEVPROP_STORE_SYSTEM, NULL },
        { DEVPKEY_Device_CompatibleIds, DEVPROP_STORE_SYSTEM, NULL }
    };

    hr = DevGetObjectProperties(DevObjectTypeDevice,
                                DeviceInstancePath,
                                DevQueryFlagNone,
                                RTL_NUMBER_OF(RequestedProperties),
                                RequestedProperties,
                                &PropertyCount,
                                &PropertyList);

    if (FAILED(hr))
    {
        wprintf(L"Failed to retrieve properties. hr = 0x%08x\n", hr);
        goto exit;
    }

    wprintf(L"Hardware IDs:\n");
    TempProperty = DevFindProperty(&DEVPKEY_Device_HardwareIds,
                                   DEVPROP_STORE_SYSTEM,
                                   NULL,
                                   PropertyCount,
                                   PropertyList);

    if ((TempProperty == NULL) ||
        (TempProperty->Type == DEVPROP_TYPE_EMPTY) ||
        (TempProperty->Buffer == NULL))
    {
        wprintf(L"<none>\n");
    }
    else if ((TempProperty->Type != DEVPROP_TYPE_STRING_LIST) ||
             (TempProperty->BufferSize < sizeof(WCHAR)))
    {
        wprintf(L"Device '%ws' has a corrupted Hardware IDs property.\n",
                DeviceInstancePath);
    }
    else
    {
        for (PCWSTR CurrentId = (PCWSTR)TempProperty->Buffer;
             *CurrentId != L'\0';
             CurrentId += wcslen(CurrentId) + 1)
        {
            wprintf(L"%ws\n", CurrentId);
        }
    }

    wprintf(L"\nCompatible IDs:\n");
    TempProperty = DevFindProperty(&DEVPKEY_Device_CompatibleIds,
                                   DEVPROP_STORE_SYSTEM,
                                   NULL,
                                   PropertyCount,
                                   PropertyList);

    if ((TempProperty == NULL) ||
        (TempProperty->Type == DEVPROP_TYPE_EMPTY) ||
        (TempProperty->Buffer == NULL))
    {
        wprintf(L"<none>\n");
    }
    else if ((TempProperty->Type != DEVPROP_TYPE_STRING_LIST) ||
             (TempProperty->BufferSize < sizeof(WCHAR)))
    {
        wprintf(L"Device '%ws' has a corrupted Compatible IDs property.\n",
                DeviceInstancePath);
    }
    else
    {
        for (PCWSTR CurrentId = (PCWSTR)TempProperty->Buffer;
             *CurrentId != L'\0';
             CurrentId += wcslen(CurrentId) + 1)
        {
            wprintf(L"%ws\n", CurrentId);
        }
    }

  exit:

    if (PropertyList != NULL)
    {
        DevFreeObjectProperties(PropertyCount, PropertyList);
    }

    return;
}

要求

要求 价值
最低支持的客户端 Windows 10 版本 1809
支持的最低服务器 Windows Server 2019
标头 devquery.h
Onecore.lib
DLL Cfgmgr32.dll