DevCreateObjectQueryFromIds 函数 (devquery.h)
创建设备查询以基于指定的查询参数和对象 ID 列表检索属性。
语法
HRESULT DevCreateObjectQueryFromIds(
[in] DEV_OBJECT_TYPE ObjectType,
[in] PCZZWSTR pszzObjectIds,
[in] ULONG QueryFlags,
[in] ULONG cRequestedProperties,
[in, optional] const DEVPROPCOMPKEY *pRequestedProperties,
[in] ULONG cFilterExpressionCount,
[in, optional] const DEVPROP_FILTER_EXPRESSION *pFilter,
[in] PDEV_QUERY_RESULT_CALLBACK pCallback,
[in, optional] PVOID pContext,
[out] PHDEVQUERY phDevQuery
);
参数
[in] ObjectType
DEV_OBJECT_TYPE 枚举中的一个值,该值确定此查询应运行的对象类型。
[in] pszzObjectIds
查询应针对的对象的对象标识符的多 sz 列表。 有关多 sz 字符串的信息,请参阅 REG_MULTI_SZ。
[in] QueryFlags
使用按位 OR 运算组合的 DEV_QUERY_FLAGS 值。
[in] cRequestedProperties
pRequestedProperties中提供的 DEVPROPCOMPKEY 结构的数目。 如果指定了 devQueryFlagAllProperties
[in, optional] pRequestedProperties
(可选)提供一组
如果在 QueryFlags中指定了 DevQueryFlagUpdateResults,则查询将在查询结果集中的任何对象的任何属性的值发生更改时收到通知。
DEVPROPCOMPKEY 结构的 LocaleName 字段将被忽略,必须设置为 NULL。
如果 cRequestedProperties 为 0,则必须为 NULL。
[in] cFilterExpressionCount
pFilter中提供的 DEVPROP_FILTER_EXPRESSION 结构数。
[in, optional] pFilter
(可选)提供一个由 DEVPROP_FILTER_EXPRESSION 结构构成的数组,这些结构指定哪些对象应是查询结果集的一部分的筛选条件。 如果 cFilterExpressionCount 为 0,则必须为 NULL。
[in] pCallback
应将此查询的结果发送到的 PDEV_QUERY_RESULT_CALLBACK 回调函数。
[in, optional] pContext
调用方提供的上下文。 此值将传递给未修改的回调函数。
[out] phDevQuery
接收表示查询的句柄的指针。 如果 指定 DevQueryFlagsUpdateResults,则查询将接收更新,直到句柄关闭。 调用 DevCloseObjectQuery 关闭此句柄以停止查询。
返回值
如果成功创建查询,则返回S_OK;否则为适当的错误值。
言论
当客户端想要检索给定其标识的特定对象集的数据时,请使用此函数,而不是 DevCreateObjectQuery 筛选器。 此函数更高效。
有关详细信息,请参阅 DevCreateObjectQuery的备注部分,该部分也适用于此函数。
例
在以下示例中,实现 PDEV_QUERY_RESULT_CALLBACK 方法,用于在查询状态发生更改、将项添加到查询结果、更新或删除项时打印出状态消息。 接下来,将实现一个简单的查询方案,其中调用 DevCreateObjectQueryFromIds 时,会使用传入 InterfacePaths 参数中的函数的多 sz 对象 ID 列表。
void WINAPI
Example1Callback(
HDEVQUERY hDevQuery,
PVOID pContext,
const DEV_QUERY_RESULT_ACTION_DATA *pActionData
)
{
UNREFERENCED_PARAMETER(hDevQuery);
UNREFERENCED_PARAMETER(pContext);
switch (pActionData->Action)
{
case DevQueryResultStateChange:
if (pActionData->Data.State == DevQueryStateEnumCompleted)
{
wprintf(L"Enumeration of current system state complete.\n");
}
else if (pActionData->Data.State == DevQueryStateAborted)
{
wprintf(L"Query has aborted. No further results will be received.\n");
// Communicate back to the creator of the query that it has aborted
// so it can handle that appropriately, such as by recreating the
// query
}
break;
case DevQueryResultAdd:
wprintf(L"Object '%ws' has been added to the result set.\n",
pActionData->Data.DeviceObject.pszObjectId);
break;
case DevQueryResultUpdate:
wprintf(L"Object '%ws' was updated.\n",
pActionData->Data.DeviceObject.pszObjectId);
break;
case DevQueryResultRemove:
wprintf(L"Object '%ws' has been removed from the result set.\n",
pActionData->Data.DeviceObject.pszObjectId);
break;
}
}
void
Example1(PCZZWSTR InterfacePaths)
{
DEVPROPCOMPKEY RequestedProperties[] =
{
{ DEVPKEY_DeviceInterface_Enabled, DEVPROP_STORE_SYSTEM, NULL },
{ DEVPKEY_DeviceInterface_FriendlyName, DEVPROP_STORE_SYSTEM, NULL }
};
HDEVQUERY hDevQuery = NULL;
HRESULT hr = DevCreateObjectQueryFromIds(DevObjectTypeDeviceInterface,
InterfacePaths,
DevQueryFlagUpdateResults,
RTL_NUMBER_OF(RequestedProperties),
RequestedProperties,
0,
NULL,
Example1Callback,
NULL,
&hDevQuery);
if (FAILED(hr))
{
wprintf(L"Failed to create query. hr = 0x%08x\n", hr);
goto exit;
}
// do other work while the query monitors system state in the background
exit:
if (hDevQuery != NULL)
{
DevCloseObjectQuery(hDevQuery);
}
return;
}
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 10 版本 1809 |
支持的最低服务器 | Windows Server 2019 |
标头 | devquery.h |
库 | Onecore.lib |
DLL | Cfgmgr32.dll |