首页 > 解决方案 > 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 是特定设备的正确类吗?

谢谢

标签: c++wmiwql

解决方案


推荐阅读