SetupDiggetDeviceRegistryProperty:“设置数字设备注册表属性”;传递给系统调用的数据区域太小”;错误
我有一个使用SetupAPI枚举Windows XP上USB设备的代码:SetupDiggetDeviceRegistryProperty:“设置数字设备注册表属性”;传递给系统调用的数据区域太小”;错误,c,windows,winapi,windows-xp,setupapi,C,Windows,Winapi,Windows Xp,Setupapi,我有一个使用SetupAPI枚举Windows XP上USB设备的代码: HDEVINFO hDevInfo = SetupDiGetClassDevs( &_DEVINTERFACE_USB_DEVICE, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); for (DWORD i = 0; ; ++i) { SP_DEVINFO_DATA devInfo; devInfo.cbSize
HDEVINFO hDevInfo = SetupDiGetClassDevs( &_DEVINTERFACE_USB_DEVICE, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
for (DWORD i = 0; ; ++i)
{
SP_DEVINFO_DATA devInfo;
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
BOOL succ = SetupDiEnumDeviceInfo(hDevInfo, i, &devInfo);
if (GetLastError() == ERROR_NO_MORE_ITEMS)
break;
if (!succ) continue;
DWORD devClassPropRequiredSize = 0;
succ = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfo, SPDRP_COMPATIBLEIDS, NULL, NULL, 0, &devClassPropRequiredSize);
if (!succ)
{
// This shouldn't happen!
continue;
}
}
它过去工作多年,但现在我从SetupDiGetDeviceRegistryProperty
得到FALSE
,最后一个错误是“传递给系统调用的数据区域太小”。
我的调用参数似乎与此函数的文档相对应:
有什么问题吗?问题出在您的原始代码中:
SetupDiGetDeviceRegistryProperty
函数可能会在所需属性不存在时返回FALSE
(并将最后一个错误设置为error\u unciplement\u BUFFER
)(或者当其数据无效时,是的,他们懒得选择正确的错误代码)因此,作为一种(并非如此)特殊情况,您应该始终检查错误\u缓冲区不足
:
DWORD devClassPropRequiredSize = 0;
succ = SetupDiGetDeviceRegistryProperty(
hDevInfo,
&devInfo,
SPDRP_COMPATIBLEIDS,
NULL,
NULL,
0,
&devClassPropRequiredSize);
if (!succ) {
if (ERROR_INSUFFICIENT_BUFFER == GetLastError() {
// I may ignore this property or I may simply
// go on, required size has been set in devClassPropRequiredSize
// so next call should work as expected (or fail in a managed way).
} else {
continue; // Cannot read property size
}
}
通常,在读取属性大小时,您可以忽略此错误(如果devClassPropRequiredSize
仍然为零,您可以将其默认为允许的最大长度的适当常量)。如果无法读取属性,则下一次调用setupDiGetDeviceRegistrProperty
将失败(您将在那里管理错误),但通常您能够读取值,代码将正常工作