C# P/Invoke void** 指针传递
本文关键字:指针 void Invoke | 更新日期: 2023-09-27 18:34:47
我正在使用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);
这应该是你需要做的。