获取所有USB设备,列举所有USB设备
#include <INITGUID.h>
#include <setupapi.h>
#pragma comment(lib, "setupapi.lib")
#define MY_USB_PID_VID _T("VID_1111&PID_2222")
DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,
0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE
DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB,
0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8);
#define GUID_CLASS_USB_HUB GUID_DEVINTERFACE_USB_HUB
//枚举所有usb设备
BOOL CMFCApplication1Dlg::EnumUSBDevice(OUT char acDevPath[MAX_PATH][MAX_PATH], OUT int &nDevNum)
{
//入参检测
nDevNum = 0;
if (NULL == acDevPath)
return FALSE;
ZeroMemory(acDevPath, sizeof(acDevPath));
BOOL bRet = FALSE;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; // 保存设备接口信息
DWORD dwRequiredSize = 0; // 得到详细信息时需要的内存大小
PSP_INTERFACE_DEVICE_DETAIL_DATA pDeviceDetailData = NULL; // 详细信息
HDEVINFO hDeviceInfo; // 设备信息集合的指针
GUID InterfaceGUID = GUID_CLASS_USB_DEVICE;
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
// 枚举设备
int i = 0;
hDeviceInfo = SetupDiGetClassDevs(&InterfaceGUID, NULL, NULL, DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);
if (hDeviceInfo == INVALID_HANDLE_VALUE)
return FALSE;
while (1)
{
bRet = SetupDiEnumDeviceInterfaces(hDeviceInfo, NULL, &InterfaceGUID, i++, &DeviceInterfaceData);
if(!bRet)
break;
// 下面需要得到Interface的详细信息
// 先得到详细信息需要的内存大小
bRet = SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &DeviceInterfaceData, NULL, 0, &dwRequiredSize, NULL);
if(bRet)
break;
// 为详细信息分配内存
if(pDeviceDetailData)
{
free(pDeviceDetailData);
pDeviceDetailData = NULL;
}
pDeviceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(dwRequiredSize);
if(pDeviceDetailData == NULL)
break;
// 得到Interface的详细信息
pDeviceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
SP_DEVINFO_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
bRet = SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &DeviceInterfaceData, pDeviceDetailData, dwRequiredSize, &dwRequiredSize,
&DeviceInfoData);
if (!bRet)
break;
strcpy(acDevPath[nDevNum], pDeviceDetailData->DevicePath);
nDevNum++;
}
if(pDeviceDetailData)
{
free(pDeviceDetailData);
pDeviceDetailData = NULL;
}
SetupDiDestroyDeviceInfoList(hDeviceInfo);
return TRUE;
}
void CMFCApplication1Dlg::OnBnClickedButton1()
{
CString sDevPath, svid, spid,str1,str2;
char acDevPath[MAX_PATH][MAX_PATH];
int nDevNum = 0;
if(EnumUSBDevice(acDevPath, nDevNum))
{
for (int i=0; i<nDevNum; i++)
{
//解析usb设备路径中的vid和pid
sDevPath =acDevPath[i];
sDevPath = sDevPath.Right(sDevPath.GetLength()-sDevPath.Find('#')-1);
sDevPath = sDevPath.Left(sDevPath.Find('#'));
svid = sDevPath.Left(sDevPath.Find('&'));
svid = svid.Right(svid.GetLength()-4);
spid = sDevPath.Right(sDevPath.GetLength()-sDevPath.Find('&')-1);
spid = spid.Right(spid.GetLength()-4);
str1 += svid;
str1 += "|";
str2 += spid;
str2 += "|";
}
AfxMessageBox(str1);
AfxMessageBox(str2);
}
}