C定义结构如下:
#pragma pack(push,_CTRL_BLOCK)
#pragma pack(1)
struct DeliverResp
{
char SMsgID[21];
int NMsgFormat;
char SSrcTermID[22];
int NIsReport;
int NMsgLen;
char sMsgContent[253];
char sDestTermID[22];
char sRecvTime[15];
char sReserved[9];
int nTP_pid;
int nTP_udhi;
char sLinkID[21];
int nSrcTermType;
char sSrcTermPseudo[22];
int nSubmitMsgType;
int nSPDealResult;
};
#pragma pack(pop,_CTRL_BLOCK)C 函数调用
int WINAPI SMGPDeliver( int nTimeOut, DeliverResp* pDeliverResp );现在C#中调用这个函数,dll中包含的其他函数调用没问题,就是这个接收信息的出错,估计是结构定义有问题,无法对齐dll返回的数据,C#代码如下:
函数调用:
[DllImport("****.dll")]
public static extern int SMGPDeliver(int nTimeOut, out DeliverResp pDeliverResp);结构定义,我目前用了两种:
[StructLayout(LayoutKind.Sequential, Size = 417)]
public struct DeliverResp
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
public byte[] SMsgID;
public int NMsgFormat;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public byte[] SSrcTermID;
public int NIsReport;
public int NMsgLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 253)]
public byte[] sMsgContent;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public byte[] sDestTermID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public byte[] sRecvTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
public byte[] sReserved;
public int nTP_pid;
public int nTP_udhi;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
public byte[] sLinkID;
public int nSrcTermType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public byte[] sSrcTermPseudo;
public int nSubmitMsgType;
public int nSPDealResult;
}
这种可以编译运行,但是返回的结果没有对齐,请帮忙看看到底哪里出了问题。第二种编译出错 “因为它在 23 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。”,第一次用这种定义方法,参考了msdn中的示例代码,没发现有什么问题,不知道出错的原因,也请高手指点一下,结构定义代码如下,几个byte[]的大小可参考上一个结构定义:
[StructLayout(LayoutKind.Explicit)]
public struct DeliverResp
{
[FieldOffset(0)]public byte[] SMsgID;
[FieldOffset(21)]public int NMsgFormat;
[FieldOffset(25)]public byte[] SSrcTermID;
[FieldOffset(47)]public int NIsReport;
[FieldOffset(51)]public int NMsgLen;
[FieldOffset(55)]public byte[] sMsgContent;
[FieldOffset(308)]public byte[] sDestTermID;
[FieldOffset(330)]public byte[] sRecvTime;
[FieldOffset(345)]public byte[] sReserved;
[FieldOffset(354)]public int nTP_pid;
[FieldOffset(358)]public int nTP_udhi;
[FieldOffset(362)]public byte[] sLinkID;
[FieldOffset(383)]public int nSrcTermType;
[FieldOffset(387)]public byte[] sSrcTermPseudo;
[FieldOffset(409)]public int nSubmitMsgType;
[FieldOffset(413)]public int nSPDealResult;
}
#pragma pack(push,_CTRL_BLOCK)
#pragma pack(1)
struct DeliverResp
{
char SMsgID[21];
int NMsgFormat;
char SSrcTermID[22];
int NIsReport;
int NMsgLen;
char sMsgContent[253];
char sDestTermID[22];
char sRecvTime[15];
char sReserved[9];
int nTP_pid;
int nTP_udhi;
char sLinkID[21];
int nSrcTermType;
char sSrcTermPseudo[22];
int nSubmitMsgType;
int nSPDealResult;
};
#pragma pack(pop,_CTRL_BLOCK)C 函数调用
int WINAPI SMGPDeliver( int nTimeOut, DeliverResp* pDeliverResp );现在C#中调用这个函数,dll中包含的其他函数调用没问题,就是这个接收信息的出错,估计是结构定义有问题,无法对齐dll返回的数据,C#代码如下:
函数调用:
[DllImport("****.dll")]
public static extern int SMGPDeliver(int nTimeOut, out DeliverResp pDeliverResp);结构定义,我目前用了两种:
[StructLayout(LayoutKind.Sequential, Size = 417)]
public struct DeliverResp
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
public byte[] SMsgID;
public int NMsgFormat;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public byte[] SSrcTermID;
public int NIsReport;
public int NMsgLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 253)]
public byte[] sMsgContent;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public byte[] sDestTermID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public byte[] sRecvTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
public byte[] sReserved;
public int nTP_pid;
public int nTP_udhi;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
public byte[] sLinkID;
public int nSrcTermType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public byte[] sSrcTermPseudo;
public int nSubmitMsgType;
public int nSPDealResult;
}
这种可以编译运行,但是返回的结果没有对齐,请帮忙看看到底哪里出了问题。第二种编译出错 “因为它在 23 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。”,第一次用这种定义方法,参考了msdn中的示例代码,没发现有什么问题,不知道出错的原因,也请高手指点一下,结构定义代码如下,几个byte[]的大小可参考上一个结构定义:
[StructLayout(LayoutKind.Explicit)]
public struct DeliverResp
{
[FieldOffset(0)]public byte[] SMsgID;
[FieldOffset(21)]public int NMsgFormat;
[FieldOffset(25)]public byte[] SSrcTermID;
[FieldOffset(47)]public int NIsReport;
[FieldOffset(51)]public int NMsgLen;
[FieldOffset(55)]public byte[] sMsgContent;
[FieldOffset(308)]public byte[] sDestTermID;
[FieldOffset(330)]public byte[] sRecvTime;
[FieldOffset(345)]public byte[] sReserved;
[FieldOffset(354)]public int nTP_pid;
[FieldOffset(358)]public int nTP_udhi;
[FieldOffset(362)]public byte[] sLinkID;
[FieldOffset(383)]public int nSrcTermType;
[FieldOffset(387)]public byte[] sSrcTermPseudo;
[FieldOffset(409)]public int nSubmitMsgType;
[FieldOffset(413)]public int nSPDealResult;
}
解决方案 »
- 获取浏览器的内容?
- 大量数据比较要存储结果很慢,求指教
- 关于panel里面的button的问题
- .net 3.5的程序在win server 2008 出现ntdll.dll错误
- 问一下,英文版的.NET可以打开中文版的.NET开发的程序吗?2小时内结贴!
- 数组问题
- 自增主键的弊端
- SQL连接数据库:
- 急问题,在线等
- 学习c#建议先学习面向对象的知识,我却要推荐一本《java面向对象程序设计》,Wrox出的,太精彩了!
- 急求在C#环境下如何用16进制表示操作符?
- 从WEB用PROCESS或是VB中的SHELL调用服务器上的WINDOWS程序,而启动的WINDOWS程序中的GETCURRENTDIRECTORY却不能获取执行目录!!
#pragma pack(push,_CTRL_BLOCK)
#pragma pack(1)
struct DeliverResp
{
char SMsgID[21];
int NMsgFormat;
char SSrcTermID[22];
int NIsReport;
int NMsgLen;
char sMsgContent[253];
char sDestTermID[22];
char sRecvTime[15];
char sReserved[9];
int nTP_pid;
int nTP_udhi;
char sLinkID[21];
int nSrcTermType;
char sSrcTermPseudo[22];
int nSubmitMsgType;
int nSPDealResult;
};
#pragma pack(pop,_CTRL_BLOCK)我写到上面的,呵呵
public struct DeliverResp
....
但是我的第二种结构定义方式怎么会出错呢,能帮我找找原因吗?第二种编译出错 “因为它在 25 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。”,第一次用这种定义方法,参考了msdn中的示例代码,没发现有什么问题,不知道出错的原因,也请高手指点一下,结构定义代码如下,几个byte[]的大小可参考上一个结构定义:
[StructLayout(LayoutKind.Explicit)]
public struct DeliverResp
{
[FieldOffset(0)]public byte[] SMsgID;
[FieldOffset(21)]public int NMsgFormat;
[FieldOffset(25)]public byte[] SSrcTermID;
[FieldOffset(47)]public int NIsReport;
[FieldOffset(51)]public int NMsgLen;
[FieldOffset(55)]public byte[] sMsgContent;
[FieldOffset(308)]public byte[] sDestTermID;
[FieldOffset(330)]public byte[] sRecvTime;
[FieldOffset(345)]public byte[] sReserved;
[FieldOffset(354)]public int nTP_pid;
[FieldOffset(358)]public int nTP_udhi;
[FieldOffset(362)]public byte[] sLinkID;
[FieldOffset(383)]public int nSrcTermType;
[FieldOffset(387)]public byte[] sSrcTermPseudo;
[FieldOffset(409)]public int nSubmitMsgType;
[FieldOffset(413)]public int nSPDealResult;
}