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

时间:2013-05-25 07:35:54

标签: 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位操作系统中使其工作?

1 个答案:

答案 0 :(得分:2)

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

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()

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