[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位OS中无法运行。我如何使其在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()
  • MSDN Documentation
  • PInvoke Documentation

  • 我还发现Vista中引入了GetTcpTable2()。它包含相同的签名,所以也许看看是否调用它可以使它神奇地在x64上运行,因为您当前的调用应该可以在x86上运行。它可能无法100%即开即用地工作,但是我很好奇它能否使您走得更远或至少获得不同的结果。

    09-25 21:20