我正在使用用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'
任何帮助将不胜感激!如果需要其他信息,请尽快提供。 这个问题让我疯狂了近一个星期:( 谢谢!
答案 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);
这应该就是你需要做的一切。