Функция DevGetObjectsEx (devquery.h)
Синхронно извлекает набор структур DEV_OBJECT на основе предоставленных запрошенных свойств, расширенных параметров и критериев фильтрации.
Синтаксис
HRESULT DevGetObjectsEx(
[in] DEV_OBJECT_TYPE ObjectType,
[in] ULONG QueryFlags,
[in] ULONG cRequestedProperties,
[in, optional] const DEVPROPCOMPKEY *pRequestedProperties,
[in] ULONG cFilterExpressionCount,
[in, optional] const DEVPROP_FILTER_EXPRESSION *pFilter,
[in] ULONG cExtendedParameterCount,
[in, optional] const DEV_QUERY_PARAMETER *pExtendedParameters,
[out] PULONG pcObjectCount,
[out] const DEV_OBJECT **ppObjects
);
Параметры
[in] ObjectType
Значение из перечисления DEV_OBJECT_TYPE, определяющего тип объекта, на который должен работать этот запрос.
[in] QueryFlags
Сочетание значений DEV_QUERY_FLAGS, объединенных с помощью побитовой операции OR. Недопустимо передать DevQueryFlagUpdateResults или DevQueryFlagAsyncClose этой функции.
[in] cRequestedProperties
Количество структур DEVPROPCOMPKEY, предоставляемых в pRequestedProperties. Если указан DevQueryFlagAllProperties, это значение должно иметь значение 0.
[in, optional] pRequestedProperties
При необходимости предоставляет массив
Если devQueryFlagUpdateResults был указан в QueryFlags, запрос будет уведомлен, если значение любого из этих свойств изменяется для любого объекта в результирующем наборе запроса.
Поле LocaleName структуры DEVPROPCOMPKEY игнорируется и должно иметь значение NULL.
Если cRequestedProperties равно 0, это значение должно иметь значение NULL.
[in] cFilterExpressionCount
Количество структур DEVPROP_FILTER_EXPRESSION, предоставляемых в pFilter.
[in, optional] pFilter
При необходимости предоставляет массив структур DEVPROP_FILTER_EXPRESSION, определяющих критерии фильтрации для объектов, которые должны быть частью результирующий набор запроса. Если cFilterExpressionCount равно 0, это значение должно иметь значение NULL.
[in] cExtendedParameterCount
Зарезервировано для использования системы. Должно быть задано значение 0.
[in, optional] pExtendedParameters
Зарезервировано для использования системы. Необходимо задать значение NULL.
[out] pcObjectCount
Число DEV_OBJECT структур, возвращаемых в ppObjects.
[out] ppObjects
Указатель, который получает только что выделенный массив результатов DEV_OBJECT. Вызывающие объекты должны освободить указатель с помощью DevFreeObjects. Если объекты не перечисляются, возвращается значение NULL.
Возвращаемое значение
S_OK возвращается, если функция успешно оценила критерии поиска и возвращала соответствующие объекты; в противном случае соответствующее значение ошибки.
Замечания
Эта функция является эффективным способом синхронного перечисления объектов при извлечении их свойств. Массив возвращаемых объектов должен быть освобожден с помощью DevFreeObjects. Если запрошенное свойство не существует для объекта, соответствующего критериям фильтра, то запись DEVPROPERTY в DEV_OBJECT для этого свойства будет иметь тип DEVPROP_TYPE_EMPTY.
Прежде чем использовать эту функцию, рассмотрите, сколько данных может быть возвращено в массиве и сколько времени вызов может блокировать. Возможно, лучше использовать функцию DevCreateObjectQueryEx, что позволяет использовать данные по фрагментам и асинхронно.
В следующем примере показано использование DevGetObjectsEx для получения набора DEV_OBJECT, соответствующего набору структур DEVPROP_FILTER_EXPRESSION.
void
Example1()
{
HRESULT hr = S_OK;
ULONG ObjectCount = 0;
const DEV_OBJECT* ObjectList = NULL;
DEVPROP_BOOLEAN DevPropTrue = DEVPROP_TRUE;
DEVPROPCOMPKEY RequestedProperties[] =
{
{ DEVPKEY_Device_InstanceId, DEVPROP_STORE_SYSTEM, NULL }
};
DEVPROP_FILTER_EXPRESSION ObjectFilter[] =
{
{
DEVPROP_OPERATOR_AND_OPEN, {0}
},
{
DEVPROP_OPERATOR_EQUALS,
{
{ DEVPKEY_DeviceInterface_Enabled, DEVPROP_STORE_SYSTEM, NULL },
DEVPROP_TYPE_BOOLEAN,
sizeof(DevPropTrue),
(void*)&DevPropTrue
}
},
{
DEVPROP_OPERATOR_OR_OPEN, {0}
},
{
DEVPROP_OPERATOR_EQUALS,
{
{ DEVPKEY_DeviceInterface_ClassGuid, DEVPROP_STORE_SYSTEM, NULL },
DEVPROP_TYPE_GUID,
sizeof(GUID),
(void*)&GUID_DEVINTERFACE_MOUSE
}
},
{
DEVPROP_OPERATOR_EQUALS,
{
{ DEVPKEY_DeviceInterface_ClassGuid, DEVPROP_STORE_SYSTEM, NULL },
DEVPROP_TYPE_GUID,
sizeof(GUID),
(void*)&GUID_DEVINTERFACE_KEYBOARD
}
},
{
DEVPROP_OPERATOR_OR_CLOSE, {0}
},
{
DEVPROP_OPERATOR_AND_CLOSE, {0}
}
};
hr = DevGetObjectsEx(DevObjectTypeDeviceInterface,
DevQueryFlagNone,
RTL_NUMBER_OF(RequestedProperties),
RequestedProperties,
RTL_NUMBER_OF(ObjectFilter),
ObjectFilter,
0,
NULL,
&ObjectCount,
&ObjectList);
if (FAILED(hr))
{
wprintf(L"Failed to retrieve objects. hr = 0x%08x\n", hr);
goto exit;
}
for (ULONG i = 0; i < ObjectCount; i++)
{
wprintf(L"Retrieved object '%ws'\n",
ObjectList[i].pszObjectId);
}
exit:
if (ObjectList != NULL)
{
DevFreeObjects(ObjectCount, ObjectList);
}
return;
}
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 10 версии 1809 |
минимальный поддерживаемый сервер | Windows Server 2019 |
заголовка | devquery.h |
библиотеки |
Onecore.lib |
DLL | Cfgmgr32.dll |