IntPtr地址增量(不是值)

时间:2014-12-02 19:13:09

标签: c# .net marshalling intptr

我有一个C ++ DLL,它具有从设备发送数据的功能。从我的托管C#代码我调用C ++函数positionCallback。请注意这个位置。 pos根据定义 - 是三个指针的数组,指向位置数组。

public void positionCallback(uint devNo,uint count,uint index,ref System.IntPtr pos,ref System.IntPtr mrk)

现在我的问题是我要提取这三个数组中的每一个的数据,但我只能得到数组1的数据,而对于休息2,我得到了垃圾值。 以下是我正在尝试的代码

 // Copy the unmanaged array to managed memory for Axis 2
IntPtr ptr2 = IntPtr.Add(pos,2*sizeof(Int64));
 Marshal.Copy(pos,managedArrayAxis1,0,(int)count);
 // Copy the unmanaged array to managed memory for Axis 2
 Marshal.Copy(ptr2, managedArrayAxis2, 0, (int)count);

上面的代码仅为managedArrayAxis1提供了正确的数据,但对于managedArrayAxis2,正在收集垃圾数据。我错误地增加了pos的IntPtr地址吗?

请帮忙!

1 个答案:

答案 0 :(得分:2)

pos参数实际上是指向双数组指针数组的指针,因此您需要将其取消引用两次。您的代码发生的是ref自动解除指向指针数组的指针,但您在pos中得到的只是3个二级指针中的第一个指针,无法进入另外两个。

要获取原始指针,您需要删除ref参数上的pos关键字。然后将pos指向的数据复制到IntPtr的数组中,您将不需要任何指针算法:

public void positionCallback(uint devNo,uint count,uint index,System.IntPtr pos,ref System.IntPtr mrk)

// copy the array of pointers
IntPtr[] arrays = new IntPtr[3];
Marshal.Copy(pos, arrays, 0, 3);

// Copy the unmanaged array to managed memory for Axis 2
Marshal.Copy(arrays[0],managedArrayAxis1,0,(int)count);

// Copy the unmanaged array to managed memory for Axis 2
Marshal.Copy(arrays[1], managedArrayAxis2, 0, (int)count);