点点滴滴 访问量:
posts - 90,comments - 154,trackbacks - 8

 带有指针数组的结构体不能直接转换为C#类型的结构体,转换起来有点麻烦

 

先定义出对应C++类型的C#结构体
       public struct user_group_t
       {
           public int id;
           public string name;
       }


       public struct user_group_list
       {
           public int group_array_count;

           public IntPtr group_array;//指向 user_group_t类型的指针
       }

 

泛型函数实现转换功能

public static List<T> MarshalPtrToStructArray<T>(IntPtr p, int count)
        {
            List<T> l = new List<T>();
            for (int i = 0; i < count; i++, p = new IntPtr(p.ToInt32() + Marshal.SizeOf(typeof(T))))
            {
                T t = (T)Marshal.PtrToStructure(p, typeof(T));
                l.Add(t);
            }
            return l;
        }

 

调用方式

通常C++函数返回一个指向user_group_list类型的指针,在C#中可使用IntPtr ptrGroupList对应指针,

而user_group_list类型结构体内包含的内容是长度为 group_array_count,地址为 group_array 的数组

因为IntPtr不能如C++的指针一样进行 ptrGroupList++这样的操作,所以要访问其内部成员需要把它转换为数组或list

   使用Marshal.PtrToStructure把指向结构体的指针转换为具体的结构体

    user_group_list   tructList = (user_group_list)Marshal.PtrToStructure(ptrStructGroupList, typeof(user_group_list));

    再使用泛型转换函数实现转换

    List<user_group_t> listGroupTemp = MarshalPtrToStructArray<user_group_t>(structList.group_array, structList.group_array_count);

   

     对于list的成员访问,就方便多了

     欢迎大家提出更多更方便的转换方式

 

posted on 2010-04-13 11:41 sopper 阅读(...) 评论(...) 编辑 收藏