我现在有一个这样的问题
C/C++的函数为:GetResult(void * [],int);
第一个参数为指针数组,而此数组里面的指针为指向结构体(DLL里面定义的)的指针,
这个结构体为
struct query
{
  char Address;
  int Port;
  char user[32];
}
现在我调用GetResult(void * [],int)函数,需要初始化(void * [])这个指针数组,
在C里面我会,需要先定义一个指针数组,然后给数组里面的每个指针赋值,然后把这个指针数组的地址传给函数就可以了。
那在C#里面,我需要怎么初始化(void * [])这个指针数组,调用函数后怎么取得里面的值呢?
代码请加点必要的注释谢谢啊!
非常感谢,急啊 !谢谢

解决方案 »

  1.   

    不知道你有没有在C++做过dynamic loading DLL?如果没有请先了解一下,然后再学习用C#调用C++编写的DLL。
    这种跨平台的操作要注意数值类型的转换,因为C#中要用到托管代码,就是Managed Code,最近我也在做这方面的东西。建议你把C#的Marshal了解一下。void* ptr 或者任何 type* ptr传入C#, 他们的托管代码全都设成IntPtr ptr
    对于二级指针 void ** 要设成 ref IntPtr ptr
      

  2.   

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            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();
            }
      

  3.   

    你Query结构的Address是char*还是char[]?
      

  4.   

    直接用IntPtr作为参数传入就可以了;数组在内存中是顺序存储的,调用方法后IntPtr参数返回的是数组第一个值的地址;
    所以,数组第N个元素的地址为IntPtr + N * sizeof(struct);
    得到数组元素的地址后,用Marshal.PtrToStructure转化即可;
      

  5.   

     [DllImport("HDPDll.DLL")]
            public static extern Int32 bReadMacRecNum(UIntPtr hComPort, byte D_Addr, ref Int32 RecNum);