读书人

用C#弄过通视股票驱动接口的朋友请进解

发布时间: 2012-01-11 22:28:46 作者: rapoo

用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.UInt16 m_wMarket; // 市场类型
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]


public string m_szLabel; // 股票代码
}

[解决办法]
mark来一来.
[解决办法]
来接分了,希望楼下会!
[解决办法]
这个应该主要还是你调用DLL接口的问题吧
看样子好像这个DLL是用C++写的,你最好换个环境再测试一下看看
[解决办法]
我没有做过这种项目,不过帮你顶了,等高手,回帖是一种美德!
[解决办法]
友情up
[解决办法]

探讨
友情up

[解决办法]
乱码大多数都是字符类型的问题吧。。。。。

[解决办法]
调试了没有,具体问题在那?
[解决办法]
探讨
我没有做过这种项目,不过帮你顶了,等高手,回帖是一种美德!

[解决办法]
帮你顶了

[解决办法]
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;
}
你这写法有点怪唉
没仔细看你的代码
但是
这怎么循环呢?i根本没用啊。。。。貌似确实有问题唉

这是网上别人写得,不过是c++版本的

case FILE_HISTORY_EX: // 补日线数据
RCV_HISTORY_STRUCTEx * pDay;
pDay = pHeader->m_pDay;
ASSERT(pHeader->m_pDay[0].m_head.m_dwHeadTag == EKE_HEAD_TAG);
m_File = "日线";
j = 0;
for(i=0; i<pHeader->m_nPacketNum ; i++)
{
if( pDay.m_head.m_dwHeadTag == EKE_HEAD_TAG )
{
m_File = m_File + (const char *) pDay.m_head.m_szLabel + " ";
j ++;
}
if( j > 10) break;
}
break;



[解决办法]
typedef struct tagRCV_DATA
{
int m_wDataType; // 文件类型
int m_nPacketNum; // 记录数,参见注一
RCV_FILE_HEADEx m_File; // 文件接口
BOOL m_bDISK; // 文件是否已存盘的文件
union
{
RCV_REPORT_STRUCTEx * m_pReport;
RCV_REPORT_STRUCTExV2* m_pReportV2;
RCV_REPORT_STRUCTExV3* m_pReportV3;
RCV_HISTORY_STRUCTEx * m_pDay;
RCV_MINUTE_STRUCTEx * m_pMinute;
RCV_POWER_STRUCTEx * m_pPower;
void * m_pData; // 参见注二
};
} RCV_DATA;
根据RCV_DATA的定义
里面有个联合,你应该获取m_pDay指针啊。
但是你。。。。data.ptr这个是啥呢?看了半天没找到唉
[解决办法]
探讨
来接分了,希望楼下会!

读书人网 >C#

热点推荐