gpt4 book ai didi

c# - SetupDiGetDeviceInterfaceDetail 无法解释的错误

转载 作者:行者123 更新时间:2023-11-30 22:49:38 24 4
gpt4 key购买 nike

这次我有一个错误,我一直在尝试找出它存在的原因。虽然可以忽略该错误,但我想知道为什么它首先存在。

result = SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref anInterface, IntPtr.Zero, 0, ref buffersize, IntPtr.Zero);
if (!result)
{
int errCode = Marshal.GetLastWin32Error();
errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
statusLabel.Text += "\n(1)SetupDiGetDeviceInterfaceDetail Error: " + errCode + " => " + errorMessage + ".";
//break;
}

这是第一次调用此函数,目的只是为了为第二次调用该函数设置buffersize 变量。我收到打印的错误消息:122 => The data area passed to a system call is too small。从错误消息来看,我认为这一定与第二个参数(ref anInterface)有关,并且我可以在第二次传递时忽略它,结果证明是正确的;但错误仍然存​​在,我想知道为什么在它回来咬我之前在“后面”的地方。有问题的参数是这样声明和定义的:

[StructLayout(LayoutKind.Sequential)] // defined here
public struct SP_DEVICE_INTERFACE_DATA
{
public uint cbSize;
public Guid InterfaceClassGuid;
public uint Flags;
public IntPtr Reserved;
}

anInterface = new SP_DEVICE_INTERFACE_DATA(); // declared here
anInterface.cbSize = (uint)Marshal.SizeOf(anInterface);
anInterface.InterfaceClassGuid = Guid.Empty;
anInterface.Reserved = IntPtr.Zero;
anInterface.Flags = 0;

我已经拆解了 msdn 文章,据我所知,这里的代码没有任何问题。

最佳答案

这是设计使然。如果你看here在评论部分下:

使用此函数获取有关接口(interface)的详细信息通常是一个两步过程:

1) 获取所需的缓冲区大小。使用 NULL DeviceInterfaceDetailData 指针、零 DeviceInterfaceDetailDataSize 和有效的 RequiredSize 变量调用 SetupDiGetDeviceInterfaceDetail。作为对此类调用的响应,此函数返回 RequiredSize 所需的缓冲区大小,并因 GetLastError 返回 ERROR INSUFFICIENT BUFFER 而失败。
2) 分配一个适当大小的缓冲区并再次调用该函数以获取接口(interface)详细信息。

如果在 error codes 下查找 ERROR INSUFFICIENT BUFFER ,你会看到它是十进制值 122。

关于c# - SetupDiGetDeviceInterfaceDetail 无法解释的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com