【发布时间】:2017-05-19 13:28:14
【问题描述】:
我在调用 SetupDiGetDeviceInterfaceDetail (https://msdn.microsoft.com/en-us/library/ff551120.aspx) 时不断收到 Windows 错误 87,即使我将所有可选参数都切换为 NULL,我也会不断收到错误,但我在另一个有效的函数中使用了前两个参数,所以我不明白他们有什么不妥。
HDEVINFO hdiInfo = SetupDiGetClassDevsW(&guid, NULL, NULL, 0x12);
SP_DEVICE_INTERFACE_DATA hidDevIData = SP_DEVICE_INTERFACE_DATA();
hidDevIData.cbSize = sizeof(hidDevIData);
bool isValid = SetupDiEnumDeviceInterfaces(hdiInfo, 0, &guid, i, &hidDevIData);
if (isValid)
{
DWORD dwLength;
PSP_DEVICE_INTERFACE_DETAIL_DATA hidDevIDetailData = PSP_DEVICE_INTERFACE_DETAIL_DATA();
hidDevIData.cbSize = 8;
hidDevIDetailData = new SP_DEVICE_INTERFACE_DETAIL_DATA();
hidDevIDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SetupDiGetDeviceInterfaceDetail(hdiInfo, &hidDevIData, NULL, 0, &dwLength, NULL); //ERROR 87 : ERROR_INVALID_PARAMETER
}
我真的不知道哪个参数可能不正确,因为前面的所有函数都返回 true(例如 GUID 是有效的)。
【问题讨论】:
-
在
hidDevIData.cbSize = 8;你为什么把魔法常数作为一个大小?您在这 2 个调用中没有使用相同的参数。 -
您可能希望在继续执行之前验证 SetupDiEnumDeviceInterfaces() 的返回值是否为真。如果由于某种原因此调用返回 false,则您的 hidDevIData 可能包含要传递给 SetupDiGetDeviceInterfaceDetail() 的无效数据
-
@algirdas-preidžius 对于SetupDiEnumDeviceInterfaces,将8放在两者上都会引发错误1784(提供的用户缓冲区对请求的操作无效),并将sizeof(hidDevIData)放在两者上只会使程序崩溃。就像“myprogram.exe 刚刚停止”。另外,这是对特定 USB 设备的 C# 代码的改编,所以我尽量尊重这些值。
-
@JorgeTorres 如果它返回 true 以减轻帖子中的代码,我没有写,但确实如此。我编辑了我的问题以使其更清楚。