请教一下,如何得到一个USB设备的Path name,也就是用CreateFile函数打开时的第一个参数。谢谢了!

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=1282
      

  2.   

    http://www.codeproject.com/w2k/usbdisks.asp
      

  3.   

    http://www.cppfans.com/articles/system/bcb_usb_a.asp
      

  4.   

    Result=SetupDiGetDeviceInterfaceDetail(
               hDevInfo,
               &devInfoData,
               NULL,
               0
               &Length
               NULL);
    detailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
    detailData->bSize=sizeof(PSP_DEVICE_INTERFACE_DETAIL_DATA);
    Result=SetupDiGetDeviceInterfaceDetail(
               hDevInfo,
               &devInfoData,
               detailData,
               Length,
               &Required,
               NULL);
      

  5.   

    void CCCSUSBDlg::OnOpen() 
    {
    char *sInfo;
    sInfo="正在查找系统中HID类的GUID标识...";
    m_lbInfo.AddString(sInfo); GUID guidHID;
    HidD_GetHidGuid(&guidHID); sInfo="->HID类的GUID标识为:";
    m_lbInfo.AddString(sInfo); sprintf(sInfo,"%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x",
    guidHID.Data1,
    guidHID.Data2,
    guidHID.Data3,
    guidHID.Data4[0],guidHID.Data4[1],guidHID.Data4[2],guidHID.Data4[3],
    guidHID.Data4[4],guidHID.Data4[5],guidHID.Data4[6],guidHID.Data4[7]);
    m_lbInfo.AddString(sInfo); HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidHID,
    NULL,
    0,
    DIGCF_PRESENT|DIGCF_DEVICEINTERFACE ); if(hDevInfo==INVALID_HANDLE_VALUE)
    {
    sInfo="查找USB设备出错!";
    m_lbInfo.AddString(sInfo);
    return;
    }
    else
    {
    sInfo="找到USB设备!";
    m_lbInfo.AddString(sInfo);
    }
    UINT nIndex = 0; sInfo= "正在查找可用的USB设备...";
    m_lbInfo.AddString(sInfo); SP_DEVICE_INTERFACE_DATA InterfaceData; InterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
    BOOL bSuccess;
    DWORD index=0;
    for(int i=0;i<10;i++)
    {
    bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,
      NULL,
      &guidHID,
      i,
      &InterfaceData);
    if (!bSuccess)
    {
    sInfo="  连接USB设备出错!";
    m_lbInfo.AddString(sInfo);
    break;
    }
    else
    {
    if(InterfaceData.Flags==SPINT_ACTIVE )
    {
    sprintf(sInfo,"->连接 %d",index+1);
    m_lbInfo.AddString(sInfo);
    if(INVALID_HANDLE_VALUE!=GetUSBDeviceInfo(hDevInfo,InterfaceData) )
    {
    sInfo="  测试已完成!";
    m_lbInfo.AddString(sInfo);
    }
    index++;
    }
    }
    }
    sprintf(sInfo,"总共%d个设备连接",index);
    m_lbInfo.AddString(sInfo);
    }HANDLE CCCSUSBDlg::GetUSBDeviceInfo(HDEVINFO hDevInfo, SP_DEVICE_INTERFACE_DATA InterfaceData)
    {
    char *sInfo;
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetailData; DWORD dwSize=0,dwRequieSize=0;
    SetupDiGetDeviceInterfaceDetail(hDevInfo,
    &InterfaceData,
    NULL,
    0,
    &dwSize,
    NULL); dwRequieSize=dwSize;
    pDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(dwRequieSize);
    pDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //SP_DEVINFO_DATA InfoData;
    //InfoData.cbSize=sizeof(SP_DEVINFO_DATA);
    if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,
     &InterfaceData,
     pDetailData,
     dwSize,
     &dwRequieSize,
     NULL))
    {
    sInfo="  查找设备路径时出错!";
    m_lbInfo.AddString(sInfo);
    //SetupDiDestroyDeviceInfoList(hDevInfo);
    free(pDetailData);
    }
    char *sDevPath;
    sDevPath=(pDetailData->DevicePath)+2;
    *sDevPath='.';
    sDevPath-=2;
    sInfo="  设备路径:";
    m_lbInfo.AddString(sInfo);
    sInfo=sDevPath;
    m_lbInfo.AddString(sInfo);
    sInfo="  打开通信端口...";
    m_lbInfo.AddString(sInfo); HANDLE hCom = CreateFile (sDevPath,
      GENERIC_READ | GENERIC_WRITE,
      FILE_SHARE_READ | FILE_SHARE_WRITE,
      NULL, 
      OPEN_EXISTING, 
      0, 
      NULL); if (hCom == INVALID_HANDLE_VALUE)
    {
    sInfo="  无法打开通信端口。不能读取设备信息!(设备连接可能不正确)";
    m_lbInfo.AddString(sInfo);
    free(pDetailData);
    return hCom;
    }
    else
    {
    sInfo="  打开通信端口成功!";
    m_lbInfo.AddString(sInfo); HIDD_ATTRIBUTES Attribute;
    Attribute.Size=sizeof(HIDD_ATTRIBUTES); sInfo="  正在读取设备的标识...";
    m_lbInfo.AddString(sInfo);

    if(!HidD_GetAttributes(hCom,&Attribute))
    {
    sInfo="  查询设备状态时出错!";
    m_lbInfo.AddString(sInfo);
    //CloseHandle(hCom); free(pDetailData);
    return INVALID_HANDLE_VALUE;
    }
    return hCom;
    CloseHandle(hCom);
    }
    }
      

  6.   

    我用vc搞的这个程序,但是在bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,
      NULL,
      &guidHID,
      i,
      &InterfaceData);这里总是返回false请问是什么缘故??谢谢