2014-09-01 43 views
-2

我用C#将一个接口写入硬件设备。我使用PInvoke模式与API交谈。我发现这在一个API指南:在API文档中void **

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

我从来没有见过void **数据类型。那么这是什么意思?我需要一个指针来获取数据?他们为什么使用这个概念?有什么优势?

谢谢大卫和马修,

,我发现这个通知:从设备

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

看来,当我在两个频道录制时,我变成了一个有两个指针的数组。所以我能够收集这两个频道的数据。

所以,这可能是解决方案。

+1

你的问题是关于'c'或'C++'而不是'c#', – Sayse 2014-09-01 08:10:21

+0

Thx,我改变了标签。 – REMberry 2014-09-01 08:11:39

回答

1

void**是指向void*的指针。究竟是什么意思不能从原型中辨别出来。您确实需要阅读该函数的文档。

例如,参数可能用于让函数返回一个void*给调用者。它必须使用C中的指针来完成,因为C只使用按值传递。在你的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); 

底线是,你需要阅读这个函数的文档进行着进步。

0

这可能是一个无效指针数组(但不可能在没有API调用文档的情况下进行确认)。

在C#中的等价物将是一个对象数组(因为您不知道指向哪种类型)。

不幸的是,你不能在不知道缓冲区类型的情况下编组数据 - 但它可能是一个IntPtr值的数组,你已经初始化为指向一个由class Marshal