GetLastError函数()错误代码1784

GetLastError函数获取错误码后首先我会考虑一下自己调用函数参数是否有问题。然后来看我遇到的这个问题,希望对大家有所帮助

以下是我获取usb设备句柄的代码,有点粗糙,变量定义这边省略了,也不是重点

    PSP_DEVICE_INTERFACE_DETAIL_DATA	DevDetail = NULL;
    HidD_GetHidGuid(&HidGuid);    //通常返回HID设备的GUID

    //返回包含所有与指定参数匹配的已经安装设备信息句柄
    DevInfo = SetupDiGetClassDevs(&HidGuid, 
        NULL, 
        NULL, 
        (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));

    DevData.cbSize = sizeof(DevData);


    /*通过索引值获取SP_DEVICE_INTERFACE_DATA类型的指针*/
        ok = SetupDiEnumDeviceInterfaces(DevInfo, 0, &HidGuid, 0, &DevData);
        if(!ok){
            errCode = GetLastError();
            break;
        }

        /*获取DeviceInterfaceDetail的长度*/
        ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, NULL, 0, &Length, NULL);
        
        /*为Device Detailed Data分配内存*/
        DevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
        DevDetail->cbSize = sizeof(PSP_DEVICE_INTERFACE_DETAIL_DATA);    //调用前需先赋值

        /*获取DeviceInterfaceDetail*/
        ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, DevDetail, Length, NULL, NULL);
        if(!ok){
            errCode = GetLastError();
            free(DevDetail);
            DevDetail = NULL;
            continue;
        }

 

ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, NULL, 0, &Length, NULL);

这一行执行后ok其实是false,不过我们这里忽略,因为第三个参数穿的是NULL,所以会报错(这是我自己猜想,没有验证),执行完后我们获取到DeviceInterfaceDetail的长度,下面需要用到。

 

DevDetail->cbSize = sizeof(PSP_DEVICE_INTERFACE_DETAIL_DATA);    //调用SetupDiGetDeviceInterfaceDetail前需先赋值

ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, DevDetail, Length, NULL, NULL);

这边给DevDetail->cbSize赋值,查看windows api函数SetupDiGetDeviceInterfaceDetail调用前是需要这一步的。这里调试发现DevDetail->cbSize的值是4。下面SetupDiGetDeviceInterfaceDetail函数返回的ok居然还是false,通过GetLastError函数获取的返回码是1784。通过文档查看〖1784〗-提供给请求操作的用户缓冲区无效。 

这个时候对于我初学者来说是一筹莫展的,只是觉得可能参数有问题,但是没想到怎么排查。

网上查资料看到这样一段:

You have to set

DeviceInterfaceDetailData.cbSize = Marshal.SizeOf(UInt32) + Marshal.SizeOf(Char)

这个时候去看下PSP_DEVICE_INTERFACE_DETAIL_DATA这个结构体,在SetupAPI.h头文件里,大家可以自行去看下,如下:

typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A {
    DWORD  cbSize;
    CHAR   DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A;

typedef SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_DEVICE_INTERFACE_DETAIL_DATA;
typedef PSP_DEVICE_INTERFACE_DETAIL_DATA_A PSP_DEVICE_INTERFACE_DETAIL_DATA;

PSP_DEVICE_INTERFACE_DETAIL_DATA里包含了DWORD和CHAR

这样我尝试更正一下我这边的代码,如下:

DevDetail->cbSize = sizeof(DWORD) + sizeof(CHAR);	//调用前需先赋值

/*获取DeviceInterfaceDetail*/
ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, DevDetail, Length, NULL, NULL);

这时候DevDetail->cbSize是4+1,再去调用SetupDiGetDeviceInterfaceDetail返回是TRUE。(疑惑的点在于为什么DevDetail->cbSize通过sizeof(PSP_DEVICE_INTERFACE_DETAIL_DATA)得到的是4,希望有大神可以帮忙回答一下)

到这样已经解决了GetLastError错误代码1784的问题,过程有点粗糙,希望对大家能有所帮助。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值