1. 两种USB声卡A,B音频检测显示名字都是:USB audio device同时存在的话:就是 A: USB audio device 
                   B: USB audio device 2
或者 A: USB audio device 2
     B: USB audio device 
名字通过mixer系列函数和wave系列函数都能获取2.我知道 每种声卡PID唯一,我也能够获取3. ???
我怎样确定,当前 哪个名称对应哪一个PID有没有什么相关的代码?谢谢

解决方案 »

  1.   

    使用 SetupDI 的一套函数
    例如SetupDiEnumDeviceInfo
      

  2.   

    roger_ding(海天一色) :能说具体一点吗?谢谢
      

  3.   

    你说的函数我试了一下,它获取的设备名和 控制面板中设备管理器中列举的设备名
    是一致的我的问题是:
    我的两个usb声卡在设备管理器里都显示的是:usb audio device
    但是, 在声音和多媒体属性的音频页中, 显示的却分别是 
       usb audio device 和 usb audio device (2)我不知道怎么把后面那两个不同的显示名和ID联系起来请多指点,谢谢!
      

  4.   

    SetupDiGetClassDevs的最后一个不要用DIGCF_PRESENT,用别的试试
      

  5.   

    你先通过这个{a5dcbf10-6530-11d2-901f-00c04fb951ed}GUID用 setupapi 找到两个USB声卡的设备路径,然后用createfile获得handle,再用DeviceIoControl得到设备信息,看看用他们的设备信息能不能区分开他们,至于怎么设置成默认声卡我就不知道应该怎么做了,这个我也没弄过,你去http://www.driverdevelop.com(驱动开发网)上去找一找,不过驱动开发网这两天上不去,等我再帮你找找资料,你留下QQ吧,我这方面也不怎么行,我只侧尽力而为了
    我QQ:11302868.
      

  6.   

    不同的USB一定要有不同的GUID,这样就可以区分不同的PID/VID了.不过只能在2000以上版本的系统中检测代码是这样
    extern "C" int PASCAL SearchUSBDevice()
    {
    HANDLE hUsb; int nCount, i, j;//标记同一设备个数
    HDEVINFO hDevInfoSet;
    BOOL bResult;    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL;
      
    memset(m_sysversion, 0, 20);
    GetSysVersion(m_sysversion); // 检索相关GUID的USB设备总设备个数
    if (!GetUSBList())
    {
    return 0;
    }
        // 取得一个该GUID相关的设备信息集句柄
        hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE,     // class GUID 
            NULL,                    // 无关键字 
            NULL,                    // 不指定父窗口句柄 
            DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的设备
            
        // 失败...
        if (hDevInfoSet == INVALID_HANDLE_VALUE)
        {
            return NULL;
        }
      
        // 申请设备接口数据空间
         
        nCount = 0;
        bResult = TRUE;
    for (i=0; i< 34; i++)
    {
    bDeviceOpen[i] = FALSE;
    memset(m_DeviceDesc[i], 0, 256);
    }
      
    SP_DEVICE_INTERFACE_DATA ifdata;
        // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
        while (bResult)
        {

            ifdata.cbSize = sizeof(ifdata);
            // 枚举符合该GUID的设备接口
            bResult = ::SetupDiEnumDeviceInterfaces(
                hDevInfoSet,     // 设备信息集句柄
                NULL,            // 不需额外的设备描述
                (LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE,          // GUID
                (ULONG)nCount,   // 设备信息集里的设备序号
                &ifdata);        // 设备接口信息
      
            if (bResult)
            {
    ULONG                                predictedLength = 0;
    ULONG                                requiredLength = 0;
    // 取得该设备接口的细节(设备路径)
                bResult = SetupDiGetInterfaceDeviceDetail(
                    hDevInfoSet,    // 设备信息集句柄
                    &ifdata,        // 设备接口信息
                    NULL,        // 设备接口细节(设备路径)
                    0,    // 输出缓冲区大小
                    &requiredLength,           // 不需计算输出缓冲区大小(直接用设定值)
                    NULL);          // 不需额外的设备描述
                // 取得该设备接口的细节(设备路径)
    predictedLength=requiredLength; // if(pDetail)
    // {
    // pDetail =NULL;
    // }
                pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength);
                pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
    bResult = SetupDiGetInterfaceDeviceDetail(
                    hDevInfoSet,    // 设备信息集句柄
                    &ifdata,        // 设备接口信息
                    pDetail,        // 设备接口细节(设备路径)
                    predictedLength,    // 输出缓冲区大小
                    &requiredLength,           // 不需计算输出缓冲区大小(直接用设定值)
                    NULL);          // 不需额外的设备描述
      
                if (bResult)
                {
                    // 复制设备路径到输出缓冲区
                    //::strcpy(pszDevicePath[nCount], pDetail->DevicePath);
    if (strcmp(m_sysversion, "winnt")==0)
    {
    char ch[18];
    for(i=0;i<17;i++){
    ch[i]=*(pDetail->DevicePath+8+i);
    }
    ch[17]='\0';
    if (strcmp(ch,"vid_0471&pid_0666")==0)//比较版本号,防止意外出错
    {

    memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;    
    memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ;     READ_OS.hEvent = CreateEvent( NULL,    // no security
      TRUE,    // explicit reset req
     FALSE,   // initial event reset
      NULL ) ; // no name
    if (READ_OS.hEvent == NULL)   
    {
    break;
    }
           
    WRITE_OS.hEvent = CreateEvent( NULL,    // no security
      TRUE,    // explicit reset req
     FALSE,   // initial event reset
      NULL ) ; // no name
        if (NULL == WRITE_OS.hEvent)
    {
       CloseHandle( READ_OS.hEvent );
       break;
    }

    hUsb=CreateFile(pDetail->DevicePath,//&guidHID_1,//
    GENERIC_READ|GENERIC_WRITE,
                FILE_SHARE_READ|FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL/*|
    FILE_FLAG_OVERLAPPED*/,
    NULL);
    if (hUsb != NULL)
    {
    // 比较定位找到的USB在哪个USB PORT上
    char id[30];
    memset(id, 0, 30);
    i=0;
    do
    {
    id[i]=*(pDetail->DevicePath+26+i);
    i++;
    }
    while(id[i-1]!='#');
    id[i-1] = '\0';
    for (j=0; j<34; j++)
    {
    if(strcmp(id, m_USBList[j])==0)
    {
    sprintf(m_DeviceDesc[j+1], "%s", pDetail->DevicePath);
    m_USBPositionMap[nCount] = j+1;
    break;
    }
    } CloseHandle(hUsb);
    nCount++;
    // break;
    }
    }// 比较驱动版本
    }// 比较操作系统版本
    else
    {
    memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;    
    memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ;     READ_OS.hEvent = CreateEvent( NULL,    // no security
      TRUE,    // explicit reset req
     FALSE,   // initial event reset
      NULL ) ; // no name
    if (READ_OS.hEvent == NULL)   
    {
    break;
    }
           
    WRITE_OS.hEvent = CreateEvent( NULL,    // no security
      TRUE,    // explicit reset req
     FALSE,   // initial event reset
      NULL ) ; // no name
        if (NULL == WRITE_OS.hEvent)
    {
       CloseHandle( READ_OS.hEvent );
       break;
    }

    hUsb=CreateFile(pDetail->DevicePath,//&guidHID_1,//
    GENERIC_READ|GENERIC_WRITE,
                FILE_SHARE_READ|FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL/*|
    FILE_FLAG_OVERLAPPED*/,
    NULL);
    if (hUsb != NULL)
    {
    if(strcmp(pDetail->DevicePath, m_USBList[j])==0)
    {
    sprintf(m_DeviceDesc[j+1], "%s", pDetail->DevicePath);
    m_USBPositionMap[nCount] = j+1;
    break;
    }
    CloseHandle(hUsb);
    nCount++;
    // break;
    }
    }
    }
    }
    }
        // 释放设备接口数据空间
        ::GlobalFree(pDetail);
      
        // 关闭设备信息集句柄
    ::SetupDiDestroyDeviceInfoList(hDevInfoSet); iDeviceCount = nCount; return nCount;
    }
      

  7.   

    我的代码中加入了对系统版本的判断..在98系统中无法得到PID/VID,在2000及其以上是可以的.这样你可以得到不同的USB设备...然后就可以于之通讯了
      

  8.   

    不过你的声卡的名称怎么与之对应我还真没试过.你试试用createfile分别打开名称和上面那种方法得到的串,看看句柄是否一样..我就是这样匹配起来的