weixin_44963293 2023-05-22 18:46 采纳率: 0%
浏览 9

判断插入USB3.0接口的3.0U盘是不是正常抓取到了3.0功能的程序

获取设备速度失败,错误码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条回答 默认 最新

  • 小小莹儿 2023-05-22 18:52
    关注

    根据代码中的错误提示,可以看出获取设备速度失败,错误码为1,这个错误码表示函数执行失败,但没有进一步的详细信息。修改代码的逻辑需要在确定错误原因之后,因此需要对代码进行进一步调试和分析,以找出错误的原因和解决方案。

    首先需要检查代码中的所有函数调用,确认是否有错误的参数或者调用方式。比如,在这段代码中,调用了 DeviceIoControl 函数来获取设备连接信息,需要检查传入的参数是否正确,是否符合函数的要求。

    另外,还需要确认系统的环境是否满足运行该程序的要求。比如,该程序需要在 Windows 系统上运行,需要确认系统的版本和配置是否符合要求。同时,还需要检查是否有权限访问 USB 控制器和设备,是否有足够的资源来执行程序,等等。

    最后,还需要考虑程序的逻辑是否正确。比如,在这个程序中,需要对所有的 USB 控制器进行枚举,并获取它们的连接信息和设备速度,如果某个 USB 控制器没有连接任何设备,那么就会出现获取设备速度失败的情况。因此,在程序中需要增加判断是否存在连接设备的 USB 控制器,或者在出现错误时及时处理,以避免程序崩溃或者出现其他错误。

    总之,要修改这个程序并使其正常运行,需要进行细致的调试和分析,找出错误的原因,并针对性地进行修改和优化。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月22日

悬赏问题

  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数