vc++如何获取usb接口个数?

笔记本上有三个usb插口,我想通过vc来检测出机器上usb插口的个数。我试了一下createfile和deviceiocontrol,打开\\.\HCDxx然后检测出dr... 笔记本上有三个usb插口,我想通过vc来检测出机器上usb插口的个数。我试了一下createfile和deviceiocontrol,打开\\.\HCDxx然后检测出driver key name和Hub name,顺序是通过枚举USB控制器->枚举此控制器上的USB HUB,这里我只想获取usb接口个数,所以就没有获取usb设备信息,但是通过测试,我发现我的笔记本和公司的台式机都只能打开HCD1\2 (台式机的usb接口有10个,我的电脑只有3个)。这是怎么回事呢?我又如何检测机器上的usb接口个数?(之前通过注册表查了串口接口个数,很简单,到了usb这里就不行了。。。)目前代码:
问题有更新 ,这是发在csdn上的同一个问题,请关注我3#的回帖问题,谢谢~
http://bbs.csdn.net/topics/391031218
展开
 我来答
碧血玉叶花
推荐于2016-06-04 · TA获得超过4976个赞
知道大有可为答主
回答量:6154
采纳率:0%
帮助的人:1708万
展开全部

   
#include "stdafx.h"
#include   <stdio.h>   
#include   <windows.h>   
#include   <setupapi.h>   
#include   <devguid.h>   
#pragma   comment(lib,   "setupapi")   
 
int   main(int   argc,   char*   argv[])   
{   
    //   得到设备信息集   
    HDEVINFO   hDevInfo   =   SetupDiGetClassDevs(   
        (LPGUID)&GUID_DEVCLASS_PORTS,     
        NULL,     
        0,     
        DIGCF_PRESENT/*   |   DIGCF_ALLCLASSES*/);   
 
    if     (hDevInfo     ==     INVALID_HANDLE_VALUE)       
    {   
        printf("Error!   SetupDiGetClassDevs()   return   %d\n",   GetLastError());   
        SetupDiDestroyDeviceInfoList(hDevInfo);   
        return     0;       
    }   
 
    TCHAR   szBuf[MAX_PATH];   
    SP_DEVINFO_DATA   spDevInfoData   =   {sizeof(SP_DEVINFO_DATA)};   
 
    //   开始列举设备   
    DWORD   i = 0;
    for   ( i   =   0;   SetupDiEnumDeviceInfo(hDevInfo,   i,   &spDevInfoData);   i++)   
    {   
        //   得到设备类描述   
        if   (   SetupDiGetClassDescription(   
            &spDevInfoData.ClassGuid,   
            szBuf,     
            MAX_PATH,     
            NULL)   )   
        {   
            _tprintf("\n%03d   :   ClassDescription   =   %s\n",   i,   szBuf);   
        }   
 
        //   得到设备实例的唯一标识ID(由注册表路径组成)   
        if   (   SetupDiGetDeviceInstanceId(   
            hDevInfo,   
            &spDevInfoData,   
            szBuf,   
            MAX_PATH,   
            NULL)   )   
        {   
            printf("%03d   :   InstanceId   =   %s\n",   i,   szBuf);   
        }   
 
        //   得到设备名称   
        if   (   SetupDiGetDeviceRegistryProperty(   
            hDevInfo,   
            &spDevInfoData,   
            SPDRP_DEVICEDESC,   
            NULL,     
            (PBYTE)szBuf,   
            MAX_PATH,     
            NULL)   )   
        {   
            printf("%03d   :   DeviceDesc   =   %s\n",   i,   szBuf);   
        }   
 
        //   得到设备型号   
        if   (   SetupDiGetDeviceRegistryProperty(   
            hDevInfo,   
            &spDevInfoData,   
            SPDRP_FRIENDLYNAME,   
            NULL,     
            (PBYTE)szBuf,   
            MAX_PATH,     
            NULL)   )   
        {   
            printf("%03d   :   FriendName   =   %s\n",   i,   szBuf);   
        }   
 
        //   得到设备在注册表中的子路径   
        if   (   SetupDiGetDeviceRegistryProperty(   
            hDevInfo,   
            &spDevInfoData,   
            SPDRP_DRIVER,   
            NULL,     
            (PBYTE)szBuf,   
            MAX_PATH,     
            NULL)   )   
        {   
            printf("%03d   :   Regedit   Path   =   %s\n",   i,   szBuf);   
        }   
 
    }   
 
    printf("\nPort  count   =   %d\n",   i);   
    getchar();   
 
    return   0;   
}
嗳你不知可否
推荐于2018-04-14 · TA获得超过7183个赞
知道大有可为答主
回答量:4507
采纳率:81%
帮助的人:1136万
展开全部

vc++如何获取usb接口个数:

#include <windows.h>  
#include <stdio.h>  
#include <Shlwapi.h>  
#include <conio.h>  
extern "C" {  
    // Declare the C libraries used  
#include <setupapi.h>  // Must link in setupapi.lib  
#include <hidsdi.h>   // Must link in hid.lib  
  
  
}  
  
static /*const*/ GUID GUID_DEVINTERFACE_USB_DEVICE =   
{ 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };  
  
TCHAR * GetErrString(TCHAR *str, DWORD errcode)    
{    
    LPVOID lpbuf;    
    if(FormatMessage(     
        FORMAT_MESSAGE_ALLOCATE_BUFFER |    
        FORMAT_MESSAGE_FROM_SYSTEM |     
        FORMAT_MESSAGE_IGNORE_INSERTS,    
        NULL,    
        errcode,    
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),    
        (LPTSTR) &lpbuf,    
        0,    
        NULL    
        ))    
    {    
        lstrcpy(str,(LPCWSTR)lpbuf);    
        LocalFree(lpbuf);    
    }    
  
    return str;    
}    
  
int main(int argc, char* argv[])  
{  
    char szTraceBuf[256];  
    // Get device interface info set handle for all devices attached to system  
    HDEVINFO hDevInfo = SetupDiGetClassDevs(  
        &GUID_DEVINTERFACE_USB_DEVICE, /* CONST GUID * ClassGuid - USB class GUID */  
        NULL, /* PCTSTR Enumerator */  
        NULL, /* HWND hwndParent */  
        DIGCF_PRESENT | DIGCF_DEVICEINTERFACE /* DWORD Flags */  
        );   
  
    if (hDevInfo == INVALID_HANDLE_VALUE)  
    {  
        sprintf(szTraceBuf, "SetupDiClassDevs() failed. GetLastError() " \  
            "returns: 0x%x\n", GetLastError());  
        OutputDebugStringA(szTraceBuf);  
        return 1;  
    }  
    sprintf(szTraceBuf, "Device info set handle for all devices attached to " \  
        "system: 0x%x\n", hDevInfo);  
    OutputDebugStringA(szTraceBuf);  
    // Retrieve a context structure for a device interface of a device   
    // information set.  
    DWORD dwIndex = 0;  
    SP_DEVICE_INTERFACE_DATA devInterfaceData;  
    ZeroMemory(&devInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));  
    devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);  
    BOOL bRet = FALSE;  
    ULONG  neededLength,requiredLength;    
    PSP_DEVICE_INTERFACE_DETAIL_DATA         ClassDeviceData;   
    HIDD_ATTRIBUTES   attributes;   
  
    while(TRUE)  
    {   
        bRet = SetupDiEnumDeviceInterfaces(  
            hDevInfo, /* HDEVINFO DeviceInfoSet */  
            NULL, /* PSP_DEVINFO_DATA DeviceInfoData */   
            &GUID_DEVINTERFACE_USB_DEVICE, /* CONST GUID * InterfaceClassGuid */  
            dwIndex,  
            &devInterfaceData /* PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData */  
            );  
        if (!bRet)  
        {  
            TCHAR buffer[1024];  
            TCHAR szTraceBuf[1024];  
            GetErrString(buffer,GetLastError());  
  
            wsprintf(szTraceBuf, L"SetupDiEnumDeviceInterfaces failed msg:%s",buffer);  
            OutputDebugStringW(szTraceBuf);  
  
            if (GetLastError() == ERROR_NO_MORE_ITEMS)  
            {  
                break;  
            }  
        }else{  
  
            //   发现一个HID设备,获取设备的详细信息   
            //   第一次调用SetupDiGetDeviceInterfaceDetail得到ClassDeviceData的大小,但返回错误   
            SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,   
                NULL,0,&requiredLength,NULL);   
            neededLength                         =requiredLength;   
            ClassDeviceData                         =(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(neededLength);   
            ClassDeviceData-> cbSize   =sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);   
  
            //第二次调用SetupDiGetDeviceInterfaceDetail     
            //   使用 合适的neededLength.   
            if   (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,   
                ClassDeviceData,neededLength,&requiredLength,NULL))   
            {   
                free(ClassDeviceData);   
                SetupDiDestroyDeviceInfoList(hDevInfo);           
                return   -1;   
            }   
            //   建立HID设备的句柄   
            HANDLE handle=CreateFile(ClassDeviceData-> DevicePath,   
                GENERIC_READ|GENERIC_WRITE,   
                FILE_SHARE_READ|FILE_SHARE_WRITE,   
                NULL,OPEN_EXISTING,0,NULL);   
            //   获取   attributes   以便得到Vendor   ID   和   Product   ID   
            HidD_GetAttributes(handle,&attributes);   
  
            TCHAR buffer[1024];  
  
            wsprintf(buffer,L"name:%s pid=%d vid=%d version=%d \n",ClassDeviceData-> DevicePath,attributes.ProductID,attributes.VendorID,attributes.VersionNumber);  
            OutputDebugStringW(buffer);  
            CloseHandle(handle);           
  
            free(ClassDeviceData);   
  
        }  
  
        dwIndex++;    
    }  
  
    sprintf(szTraceBuf, "Number of device interface sets representing all " \  
        "devices attached to system: %d\n", dwIndex);  
    OutputDebugStringA(szTraceBuf);  
    SetupDiDestroyDeviceInfoList(hDevInfo);  
    getch();  
    return 0;  
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
archmageee4
2015-11-12 · TA获得超过1516个赞
知道大有可为答主
回答量:1581
采纳率:78%
帮助的人:922万
展开全部
这涉及到驱动方面的知识.建议下载WinSDK 关于vxd驱动方面的知识
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LoNG豆浆
2015-05-12 · 超过42用户采纳过TA的回答
知道小有建树答主
回答量:129
采纳率:0%
帮助的人:69.3万
展开全部
我也写过,然后一个都没有找出来。你可以把你的全部代码给我观摩一下嘛。能找到的例子太少了。
拜托。小白急需拯救。
还有我私信你了。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式