110,538
社区成员
发帖
与我相关
我的任务
分享
//DLL结构原型:
typedef struct person_info_s
{
int person_id;
char person_name[128];
char employee_num[128];
int iris_enroll_flag;
}person_info_t;
typedef struct person_array_t
{
person_info_t* persons; // 人员列表(数组)
int person_count; // 人员的数目
};
//第2个结构体中包括第一个结构体数组
//函数原型:
int sync_person (ATTEND_SERVER_HANDLE handle,person_info_t * pPerson,int nPersonCount,person_array_t * local_person,person_array_t * server_person);
//输出参数:person_array_t *local_person server_person
// person_array_t *server_person
//结构体:
[StructLayout(LayoutKind.Sequential)]
public struct person_info_t
{
[MarshalAs(UnmanagedType.U4)]
public uint person_id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] person_name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] employee_num;
[MarshalAs(UnmanagedType.U4)]
public uint iris_enroll_flag;
}
[StructLayout(LayoutKind.Sequential)]
public struct person_array_t
{
[MarshalAs(UnmanagedType.U4)]
public int person_count;// 人员的数目
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public person_info_t[] persons; // 人员列表(数组)
}
//函数:
[DllImport("IKLongShine-2_1_1.dll")]
public static extern IntPtr sync_person(IntPtr handle, person_info_t[] pPerson, int nPersonCount, ref person_array_t local, ref person_array_t server);
//调用:
IntPtr a = sync_person(handel, l, l.Length, ref local_person, ref server_person);
试试这个:
把:
char person_name[128];
char employee_num[128];
替换成:
public System.IntPtr person_name;
public System.IntPtr employee_num;
然后,在需要取数据的时候,使用:
System.Runtime.InteropServices.Marshal.PtrToStringAnsi(person_name);
System.Runtime.InteropServices.Marshal.PtrToStringAnsi(employee_num);
int personCount = 100;
int sizeOfPerson = Marshal.SizeOf(new person_info_t());
person_array_t person_array_t;
person_array_t.person_count = personCount;
person_array_t.persons = Marshal.AllocHGlobal(sizeOfPerson * personCount);
IntPtr[] personPtrs = new IntPtr[personCount];
for (int i = 0; i < personCount; i++)
{
person_info_t onePerson = new person_info_t();
onePerson.person_id = (uint)personCount;
personPtrs[i] = Marshal.AllocHGlobal(sizeOfPerson);
Marshal.StructureToPtr(onePerson, personPtrs[i], false);
}
Marshal.Copy(personPtrs, 0, person_array_t.persons, personCount);