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 展开
问题有更新 ,这是发在csdn上的同一个问题,请关注我3#的回帖问题,谢谢~
http://bbs.csdn.net/topics/391031218 展开
4个回答
展开全部
#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;
}
展开全部
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这涉及到驱动方面的知识.建议下载WinSDK 关于vxd驱动方面的知识
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也写过,然后一个都没有找出来。你可以把你的全部代码给我观摩一下嘛。能找到的例子太少了。
拜托。小白急需拯救。
还有我私信你了。
拜托。小白急需拯救。
还有我私信你了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询