API文档中的void **

时间:2014-09-01 08:07:12

标签: c++ c pinvoke

我将C#中的接口写入硬件设备。我使用PInvoke模式与API交谈。我在API指南中找到了这个:

unsigned int ADQxxx_GetData( void* adq_cu_ptr, int adqxxx_num, void** target_buffers)

我从未见过void **数据类型。那是什么意思呢?我需要一个指向获取数据的指针?为什么他们使用这个概念?有什么好处?

谢谢David和Mathew,

我发现了这个通知:

从设备收集数据。将数据从ADQ设备中的内部存储器缓冲区直接传输到每个数据通道的target_buffers.One缓冲区所指向的用户指定的缓冲区。因此,target_buffers可以是一个指针数组,具体取决于捕获设备有多少个通道。此函数旨在与函数MultiRecordSetup一起使用。

似乎当我在两个通道上录制时,我变成了一个带有两个指针的数组。所以我能够收集两个频道的数据。

所以这可能是解决方案。

2 个答案:

答案 0 :(得分:1)

void**是指向void*的指针。究竟是什么意思无法从原型中辨别出来。您需要阅读该功能的文档。

例如,也许该参数用于让函数向调用者返回void*。它必须使用C中的指针来完成,因为C仅使用pass by value。在您的C#转换中,这将是out IntPtr target_buffers。该功能将如下翻译:

static extern uint ADQxxx_GetData(IntPtr adq_cu_ptr, int adqxxx_num, 
    out IntPtr target_buffers);

或许该参数用于将函数传递给预先分配的缓冲区数组。在这种情况下,您将使用IntPtr[] target_buffers,翻译将是:

static extern uint ADQxxx_GetData(IntPtr adq_cu_ptr, int adqxxx_num, 
    IntPtr[] target_buffers);

最重要的是,您需要阅读此功能的文档以取得进展。

答案 1 :(得分:0)

这可能是一个无效的指针数组(但如果没有API调用的文档,则无法确定。)

C#中的等价物将是一个对象数组(因为你不知道指向的是什么类型)。

不幸的是,如果不知道缓冲区类型,您将无法编组数据 - 但它可能是一个IntPtr值数组,您已初始化它们指向{{}中某个方法返回的内存块{3}}