.net调用银江数据接口。接收数据的结构定义。 [StructLayout(LayoutKind.Sequential)] public struct RCVDATA { public System.Int32 DataType; public System.Int32 PacketNum; public RCV_FILE_HEADEx File; public System.Int32 DISK; public IntPtr ptr; } //补充分时线数据 [StructLayout(LayoutKind.Explicit)] public struct RCVMINUTE { [FieldOffset(0)] public System.UInt32 time; [FieldOffset(4)] public System.Single Price; [FieldOffset(8)] public System.Single Volume; [FieldOffset(12)] public System.Single Amount; } 处理消息时。 for (int i = 0; i < data.PacketNum; i++) { IntPtr ptr = (IntPtr)((int)data.ptr + 32 * i); object oMinute = Marshal.PtrToStructure( ptr, typeof(RCVMINUTE)); } 问题在于 data.PacketNum的值是24230,在i的值为12023前没有任何问题,返回的数据也是正确的,但当大于12023的时候,就会提示尝试读取受保护的内存的错误。测试过很多次,每次都无法完整的读出来,i总是在小于PacketNum的时候就会报错,我知道读取到的可能不是RCVMINUTE,也可能是数据头,在C的声明中他们是共用体,不过我测试过了和这个没有关系,最多只是返回的RCVMINUTE结构的值不对,不至于出现内存错误。百思不得其解,不知道是不是返回的PacketNum的长度不对,但是补日线数据不会出现这样的问题,就是补分时数据无法正确的执行。不知道tom_sh大哥在补分时数据的结构体定义和调用是怎么样的,会不会出现我所说的问题呢?还请tom_sh 大哥赐教,不胜感激。
我已很久不用通视接口了,也无法答复这个问题。原来对RCVMIN结构也不太用,主要是用分笔数据结构,所以这部分代码没有仔细去DEBUG。根据经验,最大的可能是RCVMIN结构的.NET封装不正确,你试试换一下PACK值能否解决。