如何在VB.NET中获取指向Integer的IntPtr?

时间:2009-07-29 06:05:50

标签: vb.net

我需要获取整数的地址并将其分配给IntPtr以在API中使用。怎么样?

Dim my_integer as Integer
Dim ptr as new IntPtr

' This fails because AddressOf can only be used for functions.
ptr = AddressOf my_integer

APICall(ptr)

我该怎么办?

4 个答案:

答案 0 :(得分:3)

简短的回答:你不能和你不需要。 (虽然有一种方法可以在C#中这样做。)

但还有其他方法可以做到这一点。声明外部函数APICall时,需要声明其参数ByRef,然后才使用它。 CLR将负责获取地址。

我是C#家伙,不记得VB.NET的语法,所以我道歉。这是C#中APICall的声明和使用。必须在VB.NET中完成非常相似的事情:

[DllImport("FooBar.dll")]
static extern APICall(ref int param);

int x = 3;
APICall(ref x);

总而言之,无论是C#还是VB.NET,都是关于如何声明APICall,而不是获取整数的地址。

答案 1 :(得分:3)

Marshal课程可能就是你所需要的。 This article(可能现在有点过时了)提供了一些很好的例子。

然而,我会读到格雷戈里的另一个答案,该答案谈到宣布外部功能并试图先这样做。使用Marshal应该是最后的手段。

答案 2 :(得分:2)

Imports System.Runtime.InteropServices

Dim my_integer as Integer = 0
Dim ptr as IntPtr = Marshal.AllocHGlobal(4)

Marshal.WriteInt32(my_integer)

APICall(ptr)

my_integer = Marshal.ReadInt32(ptr)

Marshal.FreeHGlobal(ptr)

答案 3 :(得分:0)

我可能完全错了,但你试过这个吗?

Dim MyInt32 As Integer = 0
Dim MyPtr As IntPtr = MyInt32