我已阅读很多关于指针的帖子,但我仍然不知道如何做到这一点。
这是功能:
Private Shared Function ca_array_put_callback(ByVal datatype As CaRequestDataTypeEnum, ByVal count As CaUnsignedLong, ByVal chid As IntPtr, ByVal PValue As IntPtr, _
ByVal pfunc As IntPtr, ByVal UserArgs As CaPvInfo) As CaErrorCodeEnum
PValue
我正在努力转移到该功能。
到目前为止,这是我的代码:
Public Function putvalue_Callback(setvalue As Single) As CaErrorCodeEnum
'write a single precision value to the pv
Dim setvalues(0) As Single
setvalues(0) = setvalue
Dim ptr_Set_Values As IntPtr
ptr_Set_Values = setvalues ' This is the line with the error
Return putvaluesarray(setvalues)
End Function
(chid
由外部函数赋值,因此无法从那里获取语法
答案 0 :(得分:2)
您可以将IntPtr
添加到数组中,如下所示:
Dim myArray() As Single = {0, 1, 2, 3}
Dim pinned As GCHandle = GCHandle.Alloc(myArray, GCHandleType.Pinned)
Dim ptr As IntPtr = pinned.AddrOfPinnedObject()
' Use ptr...
pinned.Free()
之后需要调用Free
以确保释放分配的内存。但显然,在使用IntPtr
之后才能这样做,因此您可能需要稍微重新构建代码以补偿它。
正如qwr正确地指出的那样,这看起来确实很奇怪。我希望你传递IntPtr
的函数是某种非托管API调用的声明。在托管代码中有一个共享方法是不寻常的,它要求IntPtr
参数。这只是因为它是一些潜在的非托管呼叫的包装,还是有更险恶的事情发生?