Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从指针到结构的PInvoke封送处理值_C#_Pointers_Winapi_Pinvoke - Fatal编程技术网

C# 从指针到结构的PInvoke封送处理值

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

我想从Dhcpsapi.dll调用方法DhcpEnumSubnets()

CsWin32自动生成了调用该方法所需的方法和结构

以下是我的例子:

公共静态不安全列表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