Как получить свойства устройства в Windows в C ++? - PullRequest
3 голосов
/ 13 мая 2011

В Windows, если я открою Диспетчер устройств -> щелкните правой кнопкой мыши на устройстве -> Свойства -> Подробности, я получу пары {Свойство, Значение}.Я хочу получить доступ к ним в моем коде C ++ в Visual Studio.Как мне это получить?

Спасибо,

1 Ответ

5 голосов
/ 13 мая 2011

Попробуйте функции SetupDi_, посмотрите здесь , например.

HDEVINFO WinDeviceHelper::getDevInfoForClass(QString devClassName,DWORD& dwCount)
{

    //DWORD dwGuids = 0;

    SetupDiClassGuidsFromNameW( qPrintableW(devClassName), 0, 0, &dwCount );

    //emit sSearchStarted(dwGuids);

    if(dwCount)
    {
        GUID* pGuids = new GUID[dwCount];

        BOOL success = SetupDiClassGuidsFromNameW( qPrintableW(devClassName), pGuids, dwCount, &dwCount );

        HDEVINFO hDevInfoSet = SetupDiGetClassDevsW( pGuids, NULL, NULL, DIGCF_PRESENT);

        delete [] pGuids;

        return hDevInfoSet;
    }
    else
    {
        return NULL;
    }
}
bool WinDeviceHelper::getDeviceRegistryString(HDEVINFO hDevInfoSet,SP_DEVINFO_DATA &devInfo,DWORD propertyType,QString& propValue)
{
    DWORD dwType = 0;
    DWORD requiredSize=0;
    propValue="";
    BOOL result=SetupDiGetDeviceRegistryPropertyW( hDevInfoSet, &devInfo, propertyType, &dwType, NULL, NULL, &requiredSize);
    if ((result==ERROR_INVALID_DATA) || ((dwType!=REG_MULTI_SZ)&&(dwType!=REG_SZ)) || (requiredSize==0) )
    {
        return false;
        //throw std::exception(__FILE__":"__LINE__" "__FUNCDNAME__":  Error reading registry info");
    }
    size_t strSize=requiredSize/sizeof(wchar_t)+1;
    wchar_t* requestedData = new wchar_t[strSize];// буфер
    result=SetupDiGetDeviceRegistryPropertyW( hDevInfoSet, &devInfo, propertyType, &dwType,reinterpret_cast<PBYTE>(requestedData), requiredSize, &requiredSize);
    if(result==TRUE )
    {
        propValue=QString::fromWCharArray(requestedData,wcslen(requestedData));
    }
    else
    {
        Logger::logError(QString("WinDeviceHelper::getDeviceRegistryString: SetupDiGetDeviceRegistryPropertyW failed with error %1").arg(GetLastError()));
    }
    delete[]requestedData;
    return (result==TRUE );

}

bool WinDeviceHelper::getVendorAndDeviceIds(HDEVINFO hDevInfoSet,SP_DEVINFO_DATA &devInfo,QString& vendorId, QString& deviceId)
{
    QString dataStr;
    if(getDeviceRegistryString(hDevInfoSet,devInfo,SPDRP_HARDWAREID,dataStr))
    {
        dataStr=dataStr.toUpper();
        QRegExp vidpid("(VID_)[0-9A-F]{4}(&PID_)[0-9A-F]{4}");
        int pos=dataStr.indexOf(vidpid);
        if(pos>=0)
        {
            vendorId=dataStr.mid(pos+4,4);
            pos+=8;
            pos+=5;
            deviceId=dataStr.mid(pos,4);
            return true;
        }
    }

    return false;
}

часть использования

    DWORD dwGuids = 0;
    HDEVINFO hDevInfoSet = getDevInfoForClass(drvClass,dwGuids);
    //Logger::logTrace(QString("WinDeviceHelper::searchForPort() found %1 port drivers for type %2").arg(dwGuids).arg(drvClass));
    if(dwGuids)
    {
        BOOL bMoreItems = TRUE;
        int nIndex = 0;

        SP_DEVINFO_DATA devInfo;
        devInfo.cbSize = sizeof( SP_DEVINFO_DATA );

        while( SetupDiEnumDeviceInfo( hDevInfoSet, nIndex, &devInfo ) && ( nIndex != -1 ) )
        {
            //Logger::logTrace(QString("WinDeviceHelper::searchForPort() enumerating ports. current index: %1").arg(nIndex));
            QString iVid,iPid;
            QString fName;

            if( getVendorAndDeviceIds(hDevInfoSet,devInfo,iVid,iPid)
              enter code here

        }
    }
...