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;
}