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 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable