wangshuli3908 2015-02-27 07:25 采纳率: 50%
浏览 5341

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 2015-02-27 09:18
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB动图的问题
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名