SetupDiEnumDeviceInfo-使用SetupDi系列函数进行设备信息的管理(二)

BOOLEAN
    SetupDiEnumDeviceInfo(
        IN HDEVINFO  DeviceInfoSet,
        IN DWORD  MemberIndex,
        OUT PSP_DEVINFO_DATA  DeviceInfoData
        );  

SetupDiEnumDeviceInfo  枚举指定设备信息集合的成员,并将数据放在PSP_DEVINFO_DATA中
参数说明:

DeviceInfoSet
提供一个设备信息集合的句柄

MemberIndex
指定一个要取得的设备信息成员序号,从0开始

DeviceInfoData
指向SP_DEVINFO_DATA结构的指针,关于指定成员的返回信息就放在该结构中

 

Return ValueThe

成功返回True,否则返回False)

 

 

如果要枚举全部设备信息成员,装载者首先应该将MemberIndex设为0调用SetupDiEnumDeviceInfo,然后递增MemberIndex(使用一个for循环),调用SetupDiEnumDeviceInfo,直至所有成员全部遍历(此时函数返回False,并且GetLastError返回ERROR_NO_MORE_ITEMS)

已标记关键词 清除标记
VC6.0编写的dll函数用来获取读卡器设备的友好名称,调试中发现当获取设备硬件ID SPDRP_HARDWAREID 时可以取到,但取设备友好名称SPDRP_FRIENDLYNAME时,却为空,代码如下: int _stdcall GetReaderCardFriendlyName(char *ReaderID) { // BOOL iRet = TRUE; // PDWORD dwBufSize; DWORD actualSize = 0; DWORD dwBufSize = 0; TCHAR dataBuf[MAX_PATH + 1]; // 建立缓冲区以存储设备范例ID; int len = 0; int ReaderNum = 0; GUID ReaderCardClassGuid = {0X50DD5230, 0XBA8A, 0X11D1, {0XBF, 0X5D, 0X00, 0X00, 0Xf8, 0X05, 0Xf5, 0X30}}; //得到一个Class下信息集句柄 m_NewDeviceInfoSet = SetupDiGetClassDevs(&ReaderCardClassGuid, NULL, NULL, DIGCF_PRESENT); //DIGCF_PRESENT (只列出当前存在的设备信息) if(m_NewDeviceInfoSet == INVALID_HANDLE_VALUE) { // wprintf(_T("NewDeviceInfoSet == INVALID_HANDLE_VALUE")); //bRet = FALSE; return -1; } //对得到的此class信息进行枚举 for(int Device_Index=0; ; Device_Index++) { memset((void*)&(m_ReaderCardDevInfoData), 0, sizeof(SP_DEVINFO_DATA)); m_ReaderCardDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); BOOL bResult = SetupDiEnumDeviceInfo(m_NewDeviceInfoSet, Device_Index, &m_ReaderCardDevInfoData); if(bResult == 0) { if(GetLastError() == ERROR_NO_MORE_ITEMS) { break; } // *pdwBufSize = Required_Size; } BYTE *pbReuslt = MySetupDiGetDeviceRegistryProperty( SPDRP_FRIENDLYNAME , // SPDRP_FRIENDLYNAME SPDRP_HARDWAREID SPDRP_PHYSICAL_DEVICE_OBJECT_NAME NULL,&dwBufSize); if(pbReuslt) { TCHAR *tcName = (TCHAR*)pbReuslt; free(pbReuslt); } } //销毁一个Class的device information set SetupDiDestroyDeviceInfoList(m_NewDeviceInfoSet); return 0; } BYTE* MySetupDiGetDeviceRegistryProperty( IN DWORD Property, OUT PDWORD PropertyRegDataType , OUT PDWORD pdwBufSize) { DWORD Required_Size = 0; BOOL bResult = SetupDiGetDeviceRegistryProperty( m_NewDeviceInfoSet, &m_ReaderCardDevInfoData, Property , PropertyRegDataType, NULL, 0, &Required_Size); if(!bResult) { if(ERROR_INSUFFICIENT_BUFFER == GetLastError()) { *pdwBufSize = Required_Size; BYTE *PropertyBuffer = (BYTE*)malloc(Required_Size); bResult = SetupDiGetDeviceRegistryProperty( m_NewDeviceInfoSet, &m_ReaderCardDevInfoData, Property , PropertyRegDataType, PropertyBuffer, Required_Size, NULL); if(bResult) return PropertyBuffer; else { free(PropertyBuffer); return NULL; } } else return NULL; } else return NULL; }
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页