C#调用银江接口问题,请tom_sh大哥指点。

Discussion in 'C++ / C# / Java' started by bestyq, Nov 2, 2010.

  1. .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 大哥赐教,不胜感激。
     
  2. 我已很久不用通视接口了,也无法答复这个问题。原来对RCVMIN结构也不太用,主要是用分笔数据结构,所以这部分代码没有仔细去DEBUG。根据经验,最大的可能是RCVMIN结构的.NET封装不正确,你试试换一下PACK值能否解决。
     
  3. 问题已解决,确实是RCVMIN结构的封装不正确。谢谢tom_sh大哥。
     
  4. 请问tom_sh大哥,你现在用虾米数据? 现在有办法拿到L2的逐笔数据吗?
     
  5. 我有办法拿到L2的逐笔数据,但限于交易所的规定,不能向公司局域网络以外的客户转发。
     
  6. :mad:

    不知道能不能通过其他变通的办法拿到数据,看到有人说可以从dzh的临时文件读出来,但都没有细节.