从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时使其工作。
有没有办法通过编组解决这个问题?
'values'不是'struct'的数组。它是一个**指针**到'struct values_type_struct'的数组。你想用'values'中的元素做什么?读取'values [i]'很容易('IntPtr Value = Marshal.ReadIntPtr(values_report.values,i * IntPtr.Size)'),接下来发生的事情就不清楚了。 –
我在unix操作系统上工作了很长时间,并多次阅读了整个UNIX手册。任何结构/数组您必须能够确定每个记录的结束位置。无论是通过固定大小的对象,结构中的length属性,还是像'\ 0'这样的终止字符。您的结构都是固定大小的对象,所以如果您想要一个数组,那么只需在内存中跟随另一个结构, \ 0' 。唯一的问题是,当countOfValues为零时,它将看起来像'\ 0'。所以在数组的开始处,你可能想要添加你正在发送的数组的整数。 – jdweng
@DavidHeffernan SDK中有更多方法使用指向'values_type_struct'元素的指针来执行计算。所以基本上,我无法查看结构的内容,但我可以将指针发送给另一个计算和转换方法。 – koopaking3