2017-01-10 43 views
1

从C#的.NET我试图与此签名来的PInvoke从C++组件(源没有访问)方法内如何的PInvoke在C#的结构的数组另一个结构

result_code get_values(values_report_type *values_report) 

哪里values_report是一个指向结构values_report_type的指针,其中包含我正在查询哪些方法返回的值。该结构是这样的:

typedef struct{ 
    int countOfValues; 
    values_type* values; 
    const char* name; 
} values_report_type; 

哪里values是结构values_type阵列

这里就是我会假设是问题:C++组件,我对工作让我对values_type的含量比定义

typedef struct values_type_struct *values_type 

根据文档此隐私是故意的其他任何信息结构。

所以,我的C#的PInvoke貌似现在这种权利:

[DllImport("MyLibrary.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
internal static extern result_code get_values(out values_report_type values_report); 

internal struct values_report_type{ 
    int countOfValues; 
    IntPtr values; 
    string name; 
} 

这工作正常,并给了我一个指针values结构,但我需要的是访问的values_type结构的阵列,并得到一个指向数组中每个项目的指针(每个项目的指针都是我需要的,因为我没有对结构内容的定义)。但我想不出一种方法来实现这一点,尤其是因为图书馆对我的结构有限(甚至没有给出长度)。在C++中,对于countOfValues定义的每个项目,它只是values_report.values[0]等等,但我不知道如何在将它编组为.NET时使其工作。

有没有办法通过编组解决这个问题?

+0

'values'不是'struct'的数组。它是一个**指针**到'struct values_type_struct'的数组。你想用'values'中的元素做什么?读取'values [i]'很容易('IntPtr Value = Marshal.ReadIntPtr(values_report.values,i * IntPtr.Size)'),接下来发生的事情就不清楚了。 –

+0

我在unix操作系统上工作了很长时间,并多次阅读了整个UNIX手册。任何结构/数组您必须能够确定每个记录的结束位置。无论是通过固定大小的对象,结构中的length属性,还是像'\ 0'这样的终止字符。您的结构都是固定大小的对象,所以如果您想要一个数组,那么只需在内存中跟随另一个结构, \ 0' 。唯一的问题是,当countOfValues为零时,它将看起来像'\ 0'。所以在数组的开始处,你可能想要添加你正在发送的数组的整数。 – jdweng

+0

@DavidHeffernan SDK中有更多方法使用指向'values_type_struct'元素的指针来执行计算。所以基本上,我无法查看结构的内容,但我可以将指针发送给另一个计算和转换方法。 – koopaking3

回答

2

values不是结构数组。它是一个指针结构数组。

根据注释和代码,看起来你没有定义结构本身。这就是所谓的不透明指针。您不需要知道结构大小,只需处理指向结构体的指针,然后将结果传递回库。

从这样的阵列读取所述不透明指针值:

IntPtr Value = Marshal.ReadIntPtr(values_report.values, i*IntPtr.Size); 

这获得第i个

+0

我可能错过了一些东西,但我没有看到'values'是结构指针的数组。我只是看到它是'values_type *'类型。现在我的C/C++有点不成熟,但我认为这是指向一个_single_'values_type'的指针,它可以用来表示一个'values_type'数组。指针数组不会被'values_type **'表示吗? – Abion47

+0

'typedef struct values_type_struct * values_type'。所以'values_type'是指向struct的指针。 –

+0

啊,我明白了。我不习惯寻找typedefs。 :P – Abion47

相关问题