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

C# P/Invoke void** pointer pass

本文关键字:指针 void Invoke      更新时间:2023-10-16

我正在使用C++编写的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++一样访问 C# 中生成的 pBuffer:

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

其中指针ADC是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'

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

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

这应该是你需要做的。