C# P/Invoke void** 指针传递
C# P/Invoke void** pointer pass
我正在使用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);
这应该是你需要做的。
相关文章:
- 引用一个已擦除类型(void*)的指针
- 如何将指针从一个void函数传递到另一个C++
- 指针没有更新它在void函数内部指向的值
- 错误:在为指针赋值时,void值没有被忽略
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 如何在 C++ 中将 void 函数传递给 void 指针
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- C++为 void 指针分配一个字符串
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 调用向量的函数,给定向量的指针作为 void *
- 取消引用 void 指针以将值分配给结构
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- C 与 C++,处理 void** 指针
- reinterpret_cast指向 void(*&)() 的成员函数指针
- 使用 void 指针:void **ptr.. 如何修改共享内存的值?
- 我可以将函数指针 void* 强制转换为 std::function 吗?
- void*不是一个指向对象类型的指针 - void **的铸造错误
- 如何使用空指针(void*)
- 指针(void指针)和函数有一点混淆