c# 调用c写的动态链接库时产生的问题,返回参数为结构,结构返回的值不对?

chenmu_2002 2007-03-14 01:20:55
c#部分:

结构声明:
[StructLayout(LayoutKind.Explicit, Size=96, CharSet=CharSet.Ansi)]
public struct HHNews_Head
{
[FieldOffset(0)]public string remark;
[FieldOffset(48)]public string code;
[FieldOffset(64)]public long tsflag;
[FieldOffset(80)]public short items;
[FieldOffset(82)]public short itemsize;
[FieldOffset(84)]public int date;
[FieldOffset(88)]public int time;
[FieldOffset(92)]public int offset;
};

调dll:
[DllImport("HQstruct.dll", EntryPoint="getNews_HeadStruct",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern int getNews_HeadStruct(string FileName, ref HHNews_Head pGetInfo);

调用c中的函数:
HHNews_Head head = new HHNews_Head();
int n = getNews_HeadStruct("c:\\news.hni", ref head);
// head得到的值不对,只有head.remark有值,其余为0

c的dll中结构定义及函数声明
struct HHNews_Head
{
char remark[48];
char code[16];
long tsflag[4];
short items;
short itemsize;
long date;
long time;
int offset;
};

extern "C" int __declspec(dllexport)getNews_HeadStruct(CString FileName, HHNews_Head ** pGetInfo);
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsd999 2007-03-15
  • 打赏
  • 举报
回复
关注,感觉还是C#结构没转换正确
chenmu_2002 2007-03-15
  • 打赏
  • 举报
回复
其他程序调用都正常,独C#不对,为什么呢?
sdl2005lyx 2007-03-15
  • 打赏
  • 举报
回复
lz:因为返回的数组是变长的,所以DllImport函数声明不能用数组作返回类型。
必须使用IntPtr指针做返回值,然后用Marshal.PtrToStructure读取结构内容。

代码如下:

声明:
public static extern int getNews_HeadStruct(string FileName, IntPtr pData);
使用:
HHNews_Head pGetInfo=new HHNews_Head();
IntPtr ptr=IntPtr.Zero;
int n = getNews_HeadStruct("c:\\news.hni", ptr);
Marshal.PtrToStructure(ptr,pGetInfo);



chenmu_2002 2007-03-15
  • 打赏
  • 举报
回复
应该是c#这边的代码有误,怀疑是数据没有对齐。
c中的数据和c#中数据字长不等造成的,请高手解惑,急用。
chenmu_2002 2007-03-14
  • 打赏
  • 举报
回复
我把结构里的string改为byte[] 系统报错,内存越界?

[StructLayout(LayoutKind.Explicit, Size=96, CharSet=CharSet.Ansi)]
public struct HHNews_Head
{
[FieldOffset(0)]public byte[] remark;
[FieldOffset(48)]public byte[] code;
[FieldOffset(64)]public long tsflag;
[FieldOffset(80)]public short items;
[FieldOffset(82)]public short itemsize;
[FieldOffset(84)]public int date;
[FieldOffset(88)]public int time;
[FieldOffset(92)]public int offset;
};
cangwu_lee 2007-03-14
  • 打赏
  • 举报
回复
两者的数据类型,同名但不同内涵。

string 最好用 byte[] 或者 StringBuilder

110,535

社区成员

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

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

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