我现在有一个这样的问题
C/C++的函数为:GetResult(void * [],int);
第一个参数为指针数组,而此数组里面的指针为指向结构体(DLL里面定义的)的指针,
这个结构体为
struct query
{
char Address;
int Port;
char user[32];
}
现在我调用GetResult(void * [],int)函数,需要初始化(void * [])这个指针数组,
在C里面我会,需要先定义一个指针数组,然后给数组里面的每个指针赋值,然后把这个指针数组的地址传给函数就可以了。
那在C#里面,我需要怎么初始化(void * [])这个指针数组,调用函数后怎么取得里面的值呢?
代码请加点必要的注释谢谢啊!
非常感谢,急啊 !谢谢
C/C++的函数为:GetResult(void * [],int);
第一个参数为指针数组,而此数组里面的指针为指向结构体(DLL里面定义的)的指针,
这个结构体为
struct query
{
char Address;
int Port;
char user[32];
}
现在我调用GetResult(void * [],int)函数,需要初始化(void * [])这个指针数组,
在C里面我会,需要先定义一个指针数组,然后给数组里面的每个指针赋值,然后把这个指针数组的地址传给函数就可以了。
那在C#里面,我需要怎么初始化(void * [])这个指针数组,调用函数后怎么取得里面的值呢?
代码请加点必要的注释谢谢啊!
非常感谢,急啊 !谢谢
这种跨平台的操作要注意数值类型的转换,因为C#中要用到托管代码,就是Managed Code,最近我也在做这方面的东西。建议你把C#的Marshal了解一下。void* ptr 或者任何 type* ptr传入C#, 他们的托管代码全都设成IntPtr ptr
对于二级指针 void ** 要设成 ref IntPtr ptr
public struct Query
{
public String Address;
public Int32 Port;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public String User;
} public class LibWrap
{
//这里通过值传递指针数组,C++中不能改变数组大小
//如需要此功能,可通过引用传递指针数组后再作处理(以IntPtr传递数组首地址)
[DllImport("MyDll.dll")]
public static extern void GetResult([In, Out] IntPtr[] array, Int32 size);
} static void Main(string[] args)
{
const int PointersCount = 11; //指针数量 IntPtr[] arrPointer = new IntPtr[PointersCount]; //在C++中为每一个Query结构分配内存,并将指针赋入从C#传入的指针数组中
LibWrap.GetResult(arrPointer, PointersCount); Query[] arrQuery = new Query[PointersCount]; //储存处理好的Query
for (int i=0;i<PointersCount;i++)
{
//arrQuery[i] = (Query)(Marshal.PtrToStructure(arrPointer[i], typeof(Query)));
Marshal.PtrToStructure(arrPointer[i], arrQuery[i]);
Console.WriteLine("Query{0}: Address {1}, Port {2}, User {3}", i, arrQuery[i].Address, arrQuery[i].Port, arrQuery[i].User);
}
Console.ReadKey();
}
所以,数组第N个元素的地址为IntPtr + N * sizeof(struct);
得到数组元素的地址后,用Marshal.PtrToStructure转化即可;
public static extern Int32 bReadMacRecNum(UIntPtr hComPort, byte D_Addr, ref Int32 RecNum);