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;  

}

1个回答

如果设备没有提供名称信息,就会返回空

oyljerry
oyljerry 回复wangshuli3908: 那你把设备所有相关信息都打印出来看看是否有
5 年多之前 回复
wangshuli3908
wangshuli3908 我使用的设备是TWIN读卡器,SCardListReaders 可以返回读卡器的名称,但是我不明白这个名称时从哪里获取的,注册表中并没有这个信息。
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问