c# - 在 Windows 7 64 位中使用 [DllImport ("iphlpapi.dll")]

标签 c# winforms dllimport

 [DllImport("iphlpapi.dll")]
 private static extern int GetTcpTable(IntPtr pTcpTable, ref int pdwSize, bool bOrder);

我正在使用这个 dll 并将函数调用为 GetTcpTable(IntPtr.Zero, ref iBytes, false)

它在 Windows 7 32 位操作系统中运行良好,但在 64 位操作系统中无法运行。我如何才能使其在 Windows 7 64 位操作系统中运行?

最佳答案

看起来问题出在您的签名上:

private static extern int GetTcpTable(IntPtr pTcpTable, ref int pdwSize, bool bOrder);

查看 documentation而是显示以下内容:

public static extern int GetTcpTable(byte[] pTcpTable, out int pdwSize, bool bOrder);

您正在使用 IntPtr,但它应该是一个将填充 MIB_TCPTABLE 的缓冲区结构。

我尝试查找引用实现所有这些的正确方法的文章,但没有找到很多。我很震惊 pinvoke.net 甚至没有列出 GetTcpTable 或我上面提到的结构。

编辑: 您可能想看看 GetExtendedTcpTable()

我还发现有一个GetTcpTable2()这是在 Vista 中引入的。它包含相同的签名,所以也许只是看看是否调用它而不是让它在 x64 上神奇地工作,因为你当前的调用应该在 x86 上工作。它可能无法 100% 开箱即用,但我很好奇它是否能让你走得更远或至少得到不同的结果。

关于c# - 在 Windows 7 64 位中使用 [DllImport ("iphlpapi.dll")],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16747484/

相关文章:

c# - 将 Samba 的 S-1-22-[12]-* SID 映射到名称中

c# - 通过 TCP 接收不完整/错误的字符串

c# - System.InvalidOperationException 由于调用 Application.Exit() 时的集合修改

c# - string.Split 方法的运行时间

c# - 如何将 ContextMenuStrip 添加到 ToolStripButton?

c# - 如何将字节数组转换为字符串?

C++ lib dll 的 C# 包装器类

c# - WinForm ComboBox 在数据绑定(bind)后添加文本 "Select"

c# - DllImport - C 类型到 .NET 类型

c# - 将 C# 代码注入(inject)另一个进程并调用目标函数