1

我使用 DllImport 用 C++ 编写的 WINAPI dll 来访问 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是Int32指向ADC转换器的当前值,我设法正确地得到它而没有问题

那么我如何在 C# 中实现该结构呢?我尝试定义这样的变量

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

但这会引发错误

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

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

4

1 回答 1

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);

这应该就是您需要做的所有事情。

于 2013-10-11T08:12:28.087 回答