问题描述
我正在用 C++ 编写一个 Windows 应用程序,从外部 USB 摄像头读取图像并显示它们(效果很好)。我喜欢同时监控使用的 USB 带宽。我知道存在一个 USB_BANDWIDTH_INFO 结构(https://docs.microsoft.com/en-us/windows/win32/api/usbuser/ns-usbuser-usb_bandwidth_info),但我不知道如何使用它。更准确地说:结构本身很清楚,但我如何获取/阅读它(没有找到任何示例代码来解释)?
解决方法
根据MSDN:
USB_BANDWIDTH_INFO 结构与 IOCTL_USB_USER_REQUEST I/O 控制请求一起使用,以检索有关分配带宽的信息。
因此您需要使用 IOCTL_USB_USER_REQUEST
调用 DeviceIoControl。
参考official example,可以发现:
GetHostControllerInfo(
HANDLE hHCDev,PUSBHOSTCONTROLLERINFO hcInfo)
{
USBUSER_CONTROLLER_INFO_0 UsbControllerInfo;
DWORD dwError = 0;
DWORD dwBytes = 0;
BOOL bSuccess = FALSE;
memset(&UsbControllerInfo,sizeof(UsbControllerInfo));
// set the header and request sizes
UsbControllerInfo.Header.UsbUserRequest = USBUSER_GET_CONTROLLER_INFO_0;
UsbControllerInfo.Header.RequestBufferLength = sizeof(UsbControllerInfo);
//
// Query for the USB_CONTROLLER_INFO_0 structure
//
bSuccess = DeviceIoControl(hHCDev,IOCTL_USB_USER_REQUEST,&UsbControllerInfo,sizeof(UsbControllerInfo),&dwBytes,NULL);
if (!bSuccess)
{
dwError = GetLastError();
OOPS();
}
else
{
hcInfo->ControllerInfo = (PUSB_CONTROLLER_INFO_0) ALLOC(sizeof(USB_CONTROLLER_INFO_0));
if(NULL == hcInfo->ControllerInfo)
{
dwError = GetLastError();
OOPS();
}
else
{
// copy the data into our USB Host Controller's info structure
memcpy(hcInfo->ControllerInfo,&UsbControllerInfo.Info0,sizeof(USB_CONTROLLER_INFO_0));
}
}
return dwError;
}
您可以像这样修改它:
USBUSER_CONTROLLER_INFO_0 UsbControllerInfo;
UsbControllerInfo.Header.UsbUserRequest = USBUSER_GET_BANDWIDTH_INFORMATION;
UsbControllerInfo.Header.RequestBufferLength = sizeof(UsbControllerInfo);
USB_BANDWIDTH_INFO UsbBandInfo{};
DWORD dwError = 0;
DWORD dwBytes = 0;
BOOL bSuccess = FALSE;
bSuccess = DeviceIoControl(hHCDev,&UsbBandInfo,sizeof(USB_BANDWIDTH_INFO),NULL);