C#P / Invoke void **指针传递

时间:2013-10-11 02:47:51

标签: c# c++ pinvoke void-pointers

我正在使用用Cll编写的WINAPI dll,使用DllImport来访问USB ADC / DAC转换器值。 唯一的问题是:

long ZGetBufferADC(long typeDevice, long numberDSP, void **buffer, long *size)

我已将其翻译成

[DllImport("Zadc.dll")]
public static extern Int32 ZGetBufferADC(Int32 typeDevice, Int32 numberDSP, out IntPtr    buffer, out Int32 size);

我将此功能称为

Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC);

然后我需要在C#中访问生成的pBuffer,就像在C ++中一样:

short *pBuffer16ADC = (short*) pBuffer
volt0 = resolutionADC0 * (pBuffer16ADC[pointerADC]) / amplifyADC0;

其中pointerADC是指向ADC转换器当前值的Int32,我设法正确地解决了它没有问题

那么如何在c#中实现该结构?我尝试定义像

这样的变量
IntPtr pBuffer;
Int16 pBuffer16ADC; 
pBuffer16ADC = (Int16)pBuffer;
volt0 = resolutionADC0 * (pBuffer16ADC[pointerADC]) / amplifyADC0;

但是会抛出错误

Cannot apply indexing with [] to an expression of type 'short'

任何帮助将不胜感激!如果需要其他信息,请尽快提供。 这个问题让我疯狂了近一个星期:( 谢谢!

1 个答案:

答案 0 :(得分:1)

据推测,size以字节为单位。相反,如果size是元素的数量,那么应该明白如何调整以下内容。

首先,调用函数:

Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC);

然后声明一个复制缓冲区的数组。

short[] buffer = new short[sizeBufferADC/Marshal.SizeOf(typeof(short))];

最后复制缓冲区:

Marshal.Copy(pBuffer, buffer, 0, buffer.Length);

这应该就是你需要做的一切。