获取设备速度失败,错误码1
想写一个判断插入USB3.0接口的3.0U盘是不是正常抓取到了3.0功能的程序
请问需要怎么修改啊,还是用这个代码的逻辑是行不通的
在WINDOWS系统上运行的
#include <iostream>
#include <Windows.h>
#include <Setupapi.h>
#include <devguid.h>
#include <initguid.h>
#include <Usbiodef.h>
#include <usbspec.h>
#include <usbioctl.h>
#pragma comment(lib, "Setupapi.lib")
int main()
{
// 获取所有USB控制器的句柄
HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_HOST_CONTROLLER, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
std::cout << "获取USB控制器句柄失败" << std::endl;
return 1;
}
// 枚举所有USB控制器
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, i, &DeviceInterfaceData); i++)
{
// 获取设备接口的详细信息
DWORD RequiredSize = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &RequiredSize, NULL);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
std::cout << "获取设备接口详细信息失败" << std::endl;
continue;
}
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData = reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(new BYTE[RequiredSize]);
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, pDeviceInterfaceDetailData, RequiredSize, NULL, NULL))
{
std::cout << "获取设备接口详细信息失败" << std::endl;
delete[] pDeviceInterfaceDetailData;
continue;
}
// 打开设备句柄
HANDLE hDevice = CreateFile(pDeviceInterfaceDetailData->DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
std::cout << "打开设备句柄失败" << std::endl;
delete[] pDeviceInterfaceDetailData;
continue;
}
int ConnectionIndex = 0; // 定义ConnectionIndex变量并赋值为0
USB_NODE_CONNECTION_INFORMATION_EX NodeConnectionInfoEx = { 0 };
NodeConnectionInfoEx.ConnectionIndex = ConnectionIndex;
DWORD BytesReturned = 0;
if (!DeviceIoControl(hDevice, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &NodeConnectionInfoEx, sizeof(NodeConnectionInfoEx), &NodeConnectionInfoEx, sizeof(NodeConnectionInfoEx), &BytesReturned, NULL)) {
DWORD error = GetLastError();
if (error == ERROR_INVALID_USER_BUFFER) {
std::cout << "获取设备速度失败:缓冲区长度不足" << std::endl;
}
else {
std::cout << "获取设备速度失败:错误码 " << error << std::endl;
}
CloseHandle(hDevice);
delete[] pDeviceInterfaceDetailData;
continue;
}
// 判断设备速度是否是USB 3.0
if (NodeConnectionInfoEx.Speed == UsbSuperSpeed)
{
std::cout << "3.0 U盘插入3.0 USB接口上" << std::endl;
}
else
{
std::cout << "3.0 U盘插入2.0 USB接口上" << std::endl;
}
// 关闭设备句柄
CloseHandle(hDevice);
delete[] pDeviceInterfaceDetailData;
}
// 释放资源
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
根据代码中的错误提示,可以看出获取设备速度失败,错误码为1,这个错误码表示函数执行失败,但没有进一步的详细信息。修改代码的逻辑需要在确定错误原因之后,因此需要对代码进行进一步调试和分析,以找出错误的原因和解决方案。
首先需要检查代码中的所有函数调用,确认是否有错误的参数或者调用方式。比如,在这段代码中,调用了 DeviceIoControl 函数来获取设备连接信息,需要检查传入的参数是否正确,是否符合函数的要求。
另外,还需要确认系统的环境是否满足运行该程序的要求。比如,该程序需要在 Windows 系统上运行,需要确认系统的版本和配置是否符合要求。同时,还需要检查是否有权限访问 USB 控制器和设备,是否有足够的资源来执行程序,等等。
最后,还需要考虑程序的逻辑是否正确。比如,在这个程序中,需要对所有的 USB 控制器进行枚举,并获取它们的连接信息和设备速度,如果某个 USB 控制器没有连接任何设备,那么就会出现获取设备速度失败的情况。因此,在程序中需要增加判断是否存在连接设备的 USB 控制器,或者在出现错误时及时处理,以避免程序崩溃或者出现其他错误。
总之,要修改这个程序并使其正常运行,需要进行细致的调试和分析,找出错误的原因,并针对性地进行修改和优化。