110,537
社区成员
发帖
与我相关
我的任务
分享
RecvDataHandler(const TMsgHead *pAppHead, const void *pData){
switch(pMsgHead->sDataType)
{
case 1:{//pData转成单一结构TStuct1
TStuct1 *p1= (TStuct1 *)pData;
sprintf(p1.data);
....
}
case 2:{//pData转成结构数组TStuct2
THead *pHead = (THead *)pAppHead;
TStuct2 *p2 = (TStuct2 *)pData;
for(i = 0; i < pHead ->nItems; i++)
{
//
sprintf(p2[i].nStatus);
......
}
}
}
unsafe void RecvDataHandler(ref TMsgHead pAppHead, IntPtr pData)
{
switch (pMsgHead.sDataType)
{
1:{
TStuct1 d1 = new TStuct1 ();
d1 = (TStuct1)Marshal.PtrToStructure(pData, typeof(TStuct1));
logger.Info(d1.data);//能正常得到data值
}
2:{
TStuct2 d = new TStuct2[pMsgHead.nItems];
//这句一直报错
d = (TStuct2[])Marshal.PtrToStructure(pData, typeof(TStuct2[]));
}
}
struct TStuct2{
int nStatus;
unsigned int nPre;
unsigned int nAsk[10];
__int64 iVolume;
char chfix[4]
}
我定义成
[StructLayout(LayoutKind.Sequential)]
struct TStuct2{
[MarshalAs(UnmanagedType.I4)]
public int nStatus;
[MarshalAs(UnmanagedType.I4)]
public unsigned int nPre;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32 * 4)]
public unsigned int[] nAsk[];
[MarshalAs(UnmanagedType.I8)]
public Int64 iVolume;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] chfix
}
2个问题:
1、定义__int64返回来的都是0,比如 iVolume字段,我改成long也是0,应该有其他值的
2、dll会很频繁调用这个回调函数写入数据(每秒都有上千笔),程序运行一段时间接收到一部分数据后又
报“该线程尝试读写某个虚拟地址,而它对该地址不具有相应的访问权限”,然后中止。。
d = (TStuct2[])Marshal.PtrToStructure(pData, typeof(TStuct2[]));