用C#弄过通视股票驱动接口的朋友请进
最近在弄一个股票软件。需要调用通视股票驱动接口dll取得软件要用的数据。现在即时的行情已经成功获取了。但是在获取历史数据的时候就死活获取不了,取回来的东西都是乱码。弄得头都大了,希望弄过的朋友可以帮一下忙,谢谢。
下面帖出我写的代码,不知道是不是我的代码有问题。
//重写消息循环,获取捕获的股票消息
protected override void WndProc(ref Message m)
{
RCV_DATA data;
if (m.Msg == TSMSG && Drvloaded)
{
data = (RCV_DATA)m.GetLParam(typeof(RCV_DATA));
switch (m.WParam.ToInt32())
{
//取即时行情 这里已成功取得即时行情,没有任何问题
case RCV_REPORT:
for (int i = 0; i < data.m_nPacketNum; i++)
{
RCV_REPORT_STRUCTExV3 report = (RCV_REPORT_STRUCTExV3)Marshal.PtrToStructure(new IntPtr((int)data.ptr + 158 * i), typeof(RCV_REPORT_STRUCTExV3));
TraderCommon.InstantMarket.UpdateItem(report);
}
break;
case RCV_FILEDATA:
switch (data.m_wDataType)
{
// 补日线数据;
case FILE_HISTORY_EX:
//这里出了问题,获取的数据有问题,乱码
for (int i = 0; i < data.m_nPacketNum; i++)
{
RCV_HISTORY_STRUCTEx history = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure(data.ptr, typeof(RCV_HISTORY_STRUCTEx));
this.Text = history.m_head.m_szLabel;
}
break;
// 补分钟线数据;
case FILE_MINUTE_EX:
//RCV_HISTORY_STRUCTEx_tag taginfo = (RCV_HISTORY_STRUCTEx_tag)Marshal.PtrToStructure(data.ptr, typeof(RCV_HISTORY_STRUCTEx_tag));
break;
}
break;
}
}
base.WndProc(ref m);
}
历史数据类:
[StructLayout(LayoutKind.Explicit)]
public struct RCV_HISTORY_STRUCTEx
{
[FieldOffset(0)]
public HistoryData H;
[FieldOffset(40)]
public RCV_EKE_HEADEx m_head;
}
HistoryData类:
[StructLayout(LayoutKind.Explicit)]
public struct HistoryData
{
[FieldOffset(0)]
public long m_time; //时间
[FieldOffset(8)]
public float m_fOpen; //开盘
[FieldOffset(12)]
public float m_fHigh; //最高
[FieldOffset(16)]
public float m_fLow; //最低
[FieldOffset(20)]
public float m_fClose; //收盘
[FieldOffset(24)]
public float m_fVolume; //量
[FieldOffset(28)]
public float m_fAmount; //额
[FieldOffset(32)]
public ushort m_wAdvance; //涨数,仅大盘有效
[FieldOffset(34)]
public ushort m_wDecline; //跌数,仅大盘有效
}
RCV_EKE_HEADEx类:
[StructLayout(LayoutKind.Sequential)]
public struct RCV_EKE_HEADEx
{
public System.UInt32 m_dwHeadTag; // = EKE_HEAD_TAG
public System