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的问题,过程有点粗糙,希望对大家能有所帮助。