c++ - C++ 如何知道哪个 IRQNumber 与设备相关联?
问题描述
我尝试确定特定设备与哪个 IRQNumber 相关联。然后,当我有 IRQNumber 时,我想列出此 IRQ 上的所有设备,以查看特定设备是否是此 IRQ 上的唯一设备,或者它是否共享它。
感谢外设管理器,我知道特定设备的名称和关联的 IRQNumber,但我想在 C++ 代码中执行上述操作。
我找到了 Win32_PnPAllocatedResource 类,但我无法在查询中选择设备。
查询:
sprintf(szTemp, "SELECT * FROM Win32_PnPAllocatedResource Where Dependent LIKE '\\\\%ws\\root\\cimv2:Win32_PnPEntity.DeviceID=\"%s\"'", ComputerName, DriverIDm);
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t(szTemp),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator2);
if (FAILED(hres))
{
cout << "Query for Win32_PnPAllocatedResource name failed."
<< " Error code = 0x"
<< hex << hres << endl;
pSvc2->Release();
pLoc2->Release();
CoUninitialize();
//return 1; // Program has failed.
}
对于之前获取的计算机名称和设备ID:
IEnumWbemClassObject* pEnumerator = NULL;
IEnumWbemClassObject* pEnumerator2 = NULL;
char szTemp[1024];
char szTemp2[1024];
LPCTSTR DriverID;
//////////////////////////////////////////////////////////////////
//
// DeviceID
//
//////////////////////////////////////////////////////////////////
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_PnPEntity Where Name LIKE 'Name'"), //Name of the device find in the peripheral manager
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for PnPEntity name failed."
<< " Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
//return 1; // Program has failed.
}
IWbemClassObject *pclsObj = NULL;
ULONG uReturn = 0;
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if (0 == uReturn)
{
sprintf_s(szTemp, "Device not found !");
MessageBoxA(NULL, szTemp, "Error", MB_ICONERROR);
}
VARIANT vtProp;
hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);
wcout << " DeviceID : " << vtProp.bstrVal << endl;
DriverID = vtProp.bstrVal;
int size = 0, cpt = 0, cpt2 = 0;
sprintf(szTemp2, "%ws", DriverID);
size = strlen(szTemp2);
char DriverIDm[1024];
for (cpt = 0; cpt < size + 1; cpt++)
{
if (cpt == size )
{
DriverIDm[cpt2] = '\0';
break;
}
if (szTemp2[cpt] == '\\')
{
DriverIDm[cpt2] = szTemp2[cpt];
cpt2++;
DriverIDm[cpt2] = szTemp2[cpt];
cpt2++;
}
else
{
DriverIDm[cpt2] = szTemp2[cpt];
cpt2++;
}
}
//////////////////////////////////////////////////////////////////
//
// Computer Name
//
//////////////////////////////////////////////////////////////////
LPCTSTR ComputerName;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_IRQResource"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for IRQResource failed."
<< " Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
//return 1; // Program has failed.
}
hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if (0 == uReturn)
{
sprintf_s(szTemp, "Error query !");
MessageBoxA(NULL, szTemp, "Error", MB_ICONERROR);
}
hr = pclsObj->Get(L"CSName", 0, &vtProp, 0, 0);
wcout << " CSName : " << vtProp.bstrVal << endl;
ComputerName = vtProp.bstrVal;
计算机名称和设备 ID 被拾取,没有任何错误。
现在出现错误的代码:
IWbemClassObject *pclsObj2 = NULL;
ULONG uReturn2 = 0;
while (pEnumerator2)
{
HRESULT hr2 = pEnumerator2->Next(WBEM_INFINITE, 1,
&pclsObj2, &uReturn2);
DWORD nError2 = GetLastError();
if (0 == uReturn2)
{
sprintf_s(szTemp, "Device not found !");
MessageBoxA(NULL, szTemp, "Error", MB_ICONERROR);
break;
}
hr2 的值为 0x80041017(WBEM_E_INVALID_QUERY :查询在语法上无效。)。GetLastError() 返回的值为 1008(ERROR_NO_TOKEN :尝试引用不存在的令牌。)。并且 Return2 = 0。
问题出在哪里?
Win32_PnPAllocatedResource 是知道哪个 IRQ 是特定设备的正确类吗?
谢谢
解决方案
推荐阅读
- sql - 从 Line 中提取 n 个坐标 - Bigquery
- reporting-services - SSRS 报告运行缓慢
- pandas - 如果熊猫中的NaN,如何将1添加到以前的数据
- reactjs - 模块解析失败:意外的令牌,您可能需要适当的加载器来处理此文件类型
- javascript - 如何在 JavaScript 中订阅两个 eventDispatcher
- blueprism - 如何删除集合中的空列
- html - 编辑 Shopify 的结帐
- php - 在 Woocommerce 订单总计表上显示自定义交付选项
- javascript - 将参数从 AJAX 传递给 DJANGO
- c++ - Can a Qt Application close another already launched application?