首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2012-01-11 
用C#弄过通视股票驱动接口的朋友请进最近在弄一个股票软件。需要调用通视股票驱动接口dll取得软件要用的数

用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这个是啥呢?看了半天没找到唉
[解决办法]
探讨
来接分了,希望楼下会!

热点排行