我需要获取整数的地址并将其分配给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)
我该怎么办?
答案 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