C# 从指针到结构的PInvoke封送处理值
我想从Dhcpsapi.dll调用方法DhcpEnumSubnets() CsWin32自动生成了调用该方法所需的方法和结构 以下是我的例子:C# 从指针到结构的PInvoke封送处理值,c#,pointers,winapi,pinvoke,C#,Pointers,Winapi,Pinvoke,我想从Dhcpsapi.dll调用方法DhcpEnumSubnets() CsWin32自动生成了调用该方法所需的方法和结构 以下是我的例子: 公共静态不安全列表dhcpenumsubnet(字符串服务器地址) { uint resumeHandle=0; uint首选最大值=65536; DHCP_IP_数组*enumInfo=null; 列出子网=新建(); while(PInvoke.DhcpEnumSubnets)(服务器地址, 参考resumeHandle, 首选最大值, 参考en
公共静态不安全列表dhcpenumsubnet(字符串服务器地址)
{
uint resumeHandle=0;
uint首选最大值=65536;
DHCP_IP_数组*enumInfo=null;
列出子网=新建();
while(PInvoke.DhcpEnumSubnets)(服务器地址,
参考resumeHandle,
首选最大值,
参考enumInfo,
out uint elementsRead,
out uint elementsTotal)等质量(DhcpErrorCode.SUCCESS))
{
尝试
{
DHCP_IP_数组信息=枚举信息[0];
对于(uint j=0;j
我被告知写2个for循环来生成完整的项目,然后适当地发布它们
试试看
{
对于(uint i=0;i
CsWin32自动生成此文件:
//------------------------------------------------------------------------------
//值,该值标识枚举操作。最初,该值应为零,成功调用将返回用于后续枚举请求的句柄值。例如,如果PreferredMaximum设置为100,并且服务器上存储了200个子网地址,则可以在检索前100个子网后使用resume句柄,以便在后续呼叫中获取下一个100子网,依此类推。
///指定要返回的首选最大子网地址数。如果剩余未使用的选项数小于此值,则将返回该金额。
///指向包含DHCP服务器上可用子网ID的结构的指针。如果未定义子网,此值将为空。
///指向DWORD值的指针,该值指定在EnumInfo中返回的子网地址数。
///指向DWORD值的指针,该值指定DHCP服务器上定义的尚未枚举的子网数。
///此函数在成功调用时返回ERROR_SUCCESS。如果使用相同的ResumeHandle值进行调用,并且已枚举服务器上的所有项,则此方法返回错误\u NO\u MORE\u items,ElementsRead和ElementsTotal设置为0。否则,它将返回其中一个。
///
///从docs.microsoft.com了解有关此API的更多信息。
///
[DllImport(“DHCPSAPI”,ExactSpelling=true)]
[默认DllImportSearchPath(DllImportSearchPath.System32)]
内部静态外部不安全uint DhcpEnumSubnets(PCWSTR服务器IP地址、uint*ResumeHandle、uint PreferredMaximum、DHCP\U IP\U数组**枚举信息、uint*ElementsRead、uint*ElementsTotal);
}
}
//------------------------------------------------------------------------------
//价值观。
内部不安全uint*元素;
}
}
2 for循环的方式对我不起作用,我是否遗漏了什么?
第一个代码示例适用于我,我不确定这真的是调用此方法的正确方法吗?
这部分引起了我的困惑:
DHCP\u IP\u ARRAY info=enumInfo[0]
这对像数组一样访问指针有效吗?基本上,我将值从指针传递到结构。这是否将所有需要的值分配给sruct?指针在索引0中是否只包含一个值?我想知道这是否适用于dhcpsapi.dll中的其他方法,并且索引0是否会给出所有结果?根据函数,EnumInfo
是指向DHCP_IP_数组结构的指针,可以像数组一样访问指针。
是的,这会将所有需要的值分配给sruct,指针是否只在索引0中保存一个值取决于DhcpEnumSubnets
函数。您能添加csWin32为DhcpEnumSubnets生成的内容吗?@SimonMourier是的,我已经更新了我的问题。您看过pinvoke示例吗?你需要分配内存。当未分配内存时,此语句毫无意义:DHCP_IP_ARRAY info=enumInfo[0]。如果enumInfo是地址,enumInfo[0]是第一个位置中的数据。如果分配了内存,您将使用info=enuminfo[0]@jdweng是的,在pinvoke.net中,他们使用Marshal.PtrToStructure(),它需要一个IntPtr,这里我有一个DHCP_IP_数组*。我认为DhcpEnumSubnets()将为enumInfo分配内存,这就是为什么我必须将其作为ref传递,并使用DhcpRpcFreeMemory()释放内存。感谢您的回答,您知道我如何确定指针是否只在索引0中包含一个值,这是DhcpEnumSubnets()的文档不提供此信息。@carboneum DhcpEnumSubnets()返回值或ElementsRead
。非常感谢杨小坡。ElementsRead具有子网的数量。在我的例子中,dhcpserver有4个子网,elementsRead有正确的值4。不幸的是,这不是EnumInfo指针的大小。当我访问第一个索引enumInfo[0]时,所有4个子网都存储在enumInfo[0]元素中。elementsRead的值为4和enumInfo