问题描述
- VC6.0 获取设备友好名称 (Friendly Name)
-
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;
}
解决方案
如果设备没有提供名称信息,就会返回空
时间: 2024-09-17 04:42:25