我想让PC机和一个USB接口的智能卡Reader进行通讯,使用CreatFile打开设备:Handle hCom = CreatFile(
    m_strPath,     //指定打开设备名
    GENERIC_READ|GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL );可是不知道要怎样才能获取智能卡Reader的设备名,故来求问各位大虾! 谢谢!

解决方案 »

  1.   

    某个设备的路径一般来说应该是固定的,
    如果不知道的话,可以尝试以下函数取得。SetupDiGetClassDevs  获取类设备句柄,例如USB类
    SetupDiEnumDeviceInterfaces  枚举该类所有设备
    SetupDiGetDeviceInterfaceDetail  取得某设备详细信息,可以用来确定是你想要的设备,也可以取得设备路径
      

  2.   

    SetupDiGetClassDevs 获取类设备句柄,例如USB类
    SetupDiEnumDeviceInterfaces 枚举该类所有设备
    SetupDiGetDeviceInterfaceDetail 取得某设备详细信息,可以用来确定是你想要的设备,也可以取得设备路径
      

  3.   

    上面的函数使用的是setupapi,记得要包含相应的头文件和库文件。还有,
    SetupDiGetDeviceRegistryProperty 可以取得设备相关属性,例如设备名可以参考以下一个例子,需要改动一些地方。
    #include <setupapi.h>   
    #pragma comment(lib, "setupapi.lib")const GUID GUID_DEVINTERFACE_DISPLAY_ADAPTER = { 0x5b45201d, 0xf2f2, 0x4f3b, { 0x85, 0xbb,  0x30,  0xff,  0x1f,  0x95,  0x35,  0x99 } };long GetDisplayDeviceInfo(unsigned long nAdapterIndex, tagI2CDeviceStruct* pobjI2CDevice)
    {
    pobjI2CDevice->nDisplayDeviceLength = 0; HDEVINFO hDevInfoX = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISPLAY_ADAPTER, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); 
    if (hDevInfoX == INVALID_HANDLE_VALUE)   
    {   
    //printf("Failed to get device handle. Error[%d]", GetLastError());   
    return DVDC_ERR_GET_CLASS_DEV;   
    }   
    SP_DEVINFO_DATA DeviceInfoData;   
    //DWORD dwDeviceIndex;    // Enumerate through all devices in Set.   
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);   
    if (!SetupDiEnumDeviceInfo(hDevInfoX, nAdapterIndex, &DeviceInfoData))   

    SetupDiDestroyDeviceInfoList(hDevInfoX); 
    if (GetLastError() == ERROR_NO_MORE_ITEMS) 
    return DVDC_ERR_NOT_FOUND_DISPLAY_ADAPTER; 
    else
    return DVDC_ERR_FIND_DISPLAY_ADAPTER; 
    }  DWORD   DataT = 0;   
    DWORD   buffersize   =   0; 
    LPTSTR   buffer   =   NULL;    while(!SetupDiGetDeviceRegistryProperty(   
    hDevInfoX,   
    &DeviceInfoData,   
    SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,   
    &DataT,   
    (PBYTE)buffer,   
    buffersize,   
    &buffersize))   
    {   
    if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)   
    {   
    //   Change   the   buffer   size.   
    if (buffer)   
    LocalFree(buffer);   
    buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);   
    }   
    else   
    {   
    printf("Failed to get device guid. Error[%d] \n", GetLastError());   
    break;   
    }   
    }    if (buffer)   
    {
    #ifdef _UNICODE
    int iMultiBytesLength = WideCharToMultiByte ( 
    CP_ACP, // ANSI 代码页                          
    WC_COMPOSITECHECK, // 检查重音字符                          
    buffer, // 原Unicode 串                          
    -1, // -1 意思是串以0x00结尾                          
    NULL, // 目的char字符串                          
    0, // 缓冲大小                          
    NULL, // 肥缺省字符串                          
    NULL); // 忽略这个参数 if (iMultiBytesLength <= 0)
    {
    SetupDiDestroyDeviceInfoList(hDevInfoX); 
    return DVDC_ERR_GET_DEVICE_PATH_LENGTH; 
    } if (iMultiBytesLength > sizeof(pobjI2CDevice->pcDisplayDevicePath))
    {
    SetupDiDestroyDeviceInfoList(hDevInfoX); 
    return DVDC_ERR_DEVICE_PATH_LENGTH_SMALL; 
    } WideCharToMultiByte ( 
    CP_ACP, // ANSI 代码页                          
    WC_COMPOSITECHECK, // 检查重音字符                          
    buffer, // 原Unicode 串                          
    -1, // -1 意思是串以0x00结尾                          
    pobjI2CDevice->pcDisplayDevicePath, // 目的char字符串                          
    iMultiBytesLength, // 缓冲大小                          
    NULL, // 肥缺省字符串                          
    NULL); // 忽略这个参数 //printf("  path:[%s]\n", pcResult);   
    pobjI2CDevice->nDisplayDeviceLength = iMultiBytesLength;
    #else
    //MessageBox(NULL, "not unicode", "xxxx", MB_OK);
    if ((strlen(buffer) + 1) > sizeof(pobjI2CDevice->pcDisplayDevicePath))
    {
    SetupDiDestroyDeviceInfoList(hDevInfoX); 
    return DVDC_ERR_DEVICE_PATH_LENGTH_SMALL; 
    } pobjI2CDevice->nDisplayDeviceLength = strlen(buffer) + 1;
    strcpy_s(pobjI2CDevice->pcDisplayDevicePath, sizeof(pobjI2CDevice->pcDisplayDevicePath), buffer);
    pobjI2CDevice->pcDisplayDevicePath[pobjI2CDevice->nDisplayDeviceLength] = 0;
    #endif
    } // Cleanup   
    SetupDiDestroyDeviceInfoList(hDevInfoX);   
    return DVDC_ERR_SUCCESS;
    }