我有一个Singles数组,我需要将其作为IntPtr传递给函数

时间:2014-01-06 13:17:59

标签: vb.net

我已阅读很多关于指针的帖子,但我仍然不知道如何做到这一点。

这是功能:

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由外部函数赋值,因此无法从那里获取语法

1 个答案:

答案 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参数。这只是因为它是一些潜在的非托管呼叫的包装,还是有更险恶的事情发生?