C#调用C++DLL函数,结构体输出参数不正确

yy2101 2010-09-25 05:49:25
大家好我最近在做一个调用第三方DLL的程序,遇到了问题,请帮我看看

//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

我在C#中的写法:


//结构体:
[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);


定义结构体中的结构体数组时的SizeConst如果设置过大就会报错,少了还不一定够用,因为这个数组长度不一定是多少,我现在调用这个函数可以成功,只是那两个输出参数的值取得不正确,只有数组的第一个元素有值,但是值还不正确,请帮我看看是哪里错了(函数的前三个参数没有问题).

不知道这个输出的结构体是否可以用INTPTR指向,如果可以的话应该怎么用,怎么取值,麻烦帮我写一下代码,谢谢了
...全文
428 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kongdelu2008 2010-09-26
  • 打赏
  • 举报
回复
不明白
qqiuzaihui 2010-09-26
  • 打赏
  • 举报
回复
试试这个:
把:
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);
scuticeman 2010-09-26
  • 打赏
  • 举报
回复
楼主,我也遇到这个问题,没有解决啊。
yy2101 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhangenter 的回复:]
C# code
int personCount = 100;

int sizeOfPerson = Marshal.SizeOf(new person_info_t());
person_array_t person_array_t;
person_array_t.person_count = personCoun……
[/Quote]

你好,这个personCount是未知的啊 ,这个函数中那两个输出参数的功能是输出两个库中相差的人数和人员信息,一个是存在本地库而不存在服务器上的人员,一个是存在服务器而不存在本地的人员..
冰风漫天 2010-09-25
  • 打赏
  • 举报
回复
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);

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧