股票数据接收时的问题: C++结构: 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_STRUCTEx1 * m_pReport1; RCV_REPORT_STRUCTEx2 * m_pReport2; RCV_HISTORY_STRUCTEx * m_pDay; RCV_MINUTE_STRUCTEx * m_pMinute; RCV_POWER_STRUCTEx *m_pPower; void *m_pData; // 参见注二 }; } RCV_DATA,*PRCV_DATA; typedef struct tagRCV_REPORT_STRUCTEx { WORD m_cbSize; // 结构大小 time_t m_time; // 交易时间 WORD m_wMarket; // 股票市场类型 char m_szLabel[STKLABEL_LEN]; // 股票代码,以'\0'结尾 char m_szName[STKNAME_LEN-15]; // 股票名称,以'\0'结尾 BYTE m_Dec:4; BYTE m_Enabled:1; BYTE m_VolFlag:1; BYTE m_Other:2; WORD m_ID; float m_fOpenInterest; float m_fLastOpenInterest; float m_fLastSettle; float m_fLastClose; // 昨收 float m_fOpen; // 今开 float m_fHigh; // 最高 float m_fLow; // 最低 float m_fNewPrice; // 最新 float m_fVolume; // 成交量 float m_fAmount; // 成交额 float m_fBuyPrice[3]; // 申买价1,2,3 float m_fBuyVolume[3]; // 申买量1,2,3 float m_fSellPrice[3]; // 申卖价1,2,3 float m_fSellVolume[3]; // 申卖量1,2,3 float m_fBuyPrice4; // 申买价4 float m_fBuyVolume4; // 申买量4 float m_fSellPrice4; // 申卖价4 float m_fSellVolume4; // 申卖量4 float m_fBuyPrice5; // 申买价5 float m_fBuyVolume5; // 申买量5 float m_fSellPrice5; // 申卖价5 float m_fSellVolume5; // 申卖量5 char m_szName2[48]; __int64 m_IName; } RCV_REPORT_STRUCTEx, *PRCV_REPORT_STRUCTEx; 对应的C#的结构: [StructLayout(LayoutKind.Sequential)] public struct RCV_DATA { //[FieldOffset(0)] public int m_wDataType; // 文件类型 //[FieldOffset(4)] public int m_nPacketNum; // 记录数,参见注一 //[FieldOffset(8)] public RCV_FILE_HEADEx m_File; // 文件接口 //[FieldOffset(8)] //[MarshalAs(UnmanagedType.I4)] public int m_bDISK; // 文件是否已存盘的文件 public IntPtr ptr; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_REPORT_STRUCTEx[] m_pReport; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_REPORT_STRUCTEx1[] m_pReport1; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_REPORT_STRUCTEx2[] m_pReport2; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_HISTORY_STRUCTEx[] m_pDay; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_MINUTE_STRUCTEx[] m_pMinute; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_POWER_STRUCTEx[] m_pPower; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.AsAny)] //public object m_pData; // 参见注二 } enum BYTE : byte { m_Dec = 4, m_Enabled = 1, m_VolFlag = 1, m_Other = 2 } [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)] public struct RCV_REPORT_STRUCTEx { public ushort m_cbSize; // 结构大小 public uint m_time; // 交易时间 public ushort m_wMarket; // 股票市场类型 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)] public string m_szLabel; // 股票代码,以'\0'结尾 [FieldOffset(18)] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKNAME_LEN - 15)] public string m_szName; // 股票名称,以'\0'结尾 BYTE BYTE; //BYTE m_Dec:4; //BYTE m_Enabled:1; //BYTE m_VolFlag:1; //BYTE m_Other:2; public ushort m_ID; public Single m_fOpenInterest; public Single m_fLastOpenInterest; public Single m_fLastSettle; public Single m_fLastClose; // 昨收 public Single m_fOpen; // 今开 public Single m_fHigh; // 最高 public Single m_fLow; // 最低 public Single m_fNewPrice; // 最新 public Single m_fVolume; // 成交量 public Single m_fAmount; // 成交额 public Single m_fBuyPrice1; // 申买价1 public Single m_fBuyPrice2; // 申买价2 public Single m_fBuyPrice3; // 申买价3 public Single m_fBuyVolume1; // 申买量1 public Single m_fBuyVolume2; // 申买量2 public Single m_fBuyVolume3; // 申买量3 public Single m_fSellPrice1; // 申卖价1 public Single m_fSellPrice2; // 申卖价2 public Single m_fSellPrice3; // 申卖价3 public Single m_fSellVolume1; // 申卖量1 public Single m_fSellVolume2; // 申卖量2 public Single m_fSellVolume3; // 申卖量3 //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] //public Single[] m_fBuyPrice; // 申买价1,2,3 //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] //public Single[] m_fBuyVolume; // 申买量1,2,3 //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] //public Single[] m_fSellPrice; // 申卖价1,2,3 //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] //public Single[] m_fSellVolume; // 申卖量1,2,3 public Single m_fBuyPrice4; // 申买价4 public Single m_fBuyVolume4; // 申买量4 public Single m_fSellPrice4; // 申卖价4 public Single m_fSellVolume4; // 申卖量4 public Single m_fBuyPrice5; // 申买价5 public Single m_fBuyVolume5; // 申买量5 public Single m_fSellPrice5; // 申卖价5 public Single m_fSellVolume5; // 申卖量5 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)] public string m_szName2; public long m_IName; } public class StockDataDriver : System.Windows.Forms.Form { private const int RCV_WORK_SENDMSG = 4; // 版本 2 建议使用的方式 // 其他工作方式保留 // 消息类型 private const int RCV_REPORT = 0x3f001234; private const int RCV_FILEDATA = 0x3f001235; //==================================== 数据结构 ================================================= // 证券市场 private const ushort SH_MARKET_EX = 18515; //"HS"; // 上海 private const string SZ_MARKET_EX = "ZS"; // 深圳 private const string HK_MARKET_EX = "KH"; // 香港 // 文件数据类型 // 结构数组形式的文件数据 private const int FILE_HISTORY_EX = 2; // 补日线数据 private const int FILE_MINUTE_EX = 4; // 补分钟线数据 private const int FILE_POWER_EX = 6; // 补充除权数据 private const int FILE_MIN5_EX = 81; // 补5分钟数据 private const int FILE_MIN1_EX = 82; // 补1分钟数据 private const int FILE_BASE_EX = 0x1000; // 钱龙兼容基本资料文件,m_szFileName仅包含文件名 private const int FILE_NEWS_EX = 0x1002; // 新闻类,其类型由m_szFileName中子目录名来定 private const int FILE_HTML_EX = 0x1004; // HTML文件,m_szFileName为URL private const int FILE_SOFTWARE_EX= 0x2000; // 升级软件 private const int FILE_SHAZQDATA_EX= 0x3000; // 上海债券净价交易 private const int FILE_TYPE_RES = -1; // 保留 // 消息子类型 private const int News_Sha_Ex = 2; // 上证消息 private const int News_Szn_Ex = 4; // 深证消息 private const int News_Fin_Ex = 6; // 财经报道 private const int News_TVSta_Ex = 8; // 电视台通知 private const int News_Unknown_Ex = -1; // 未知提供者 //Definition For nInfo of Function GetStockDrvInfo(int nInfo,void * pBuf); private const int RI_IDSTRING = 1; // 厂商名称,返回(LPCSTR)厂商名 private const int RI_IDCODE = 2; // 卡号 private const int RI_VERSION = 3; // 驱动程序版本 private const int RI_ERRRATE = 4; // 取信道误码 private const int RI_STKNUM = 5; // 取上市股票总家数 private const int RI_SUPPORTEXTHQ = 6; // 是否支持JSJ格式 private const int RI_ENABLEDZHTRANS = 7; // 支持传输大智慧文件系统 private const int RI_ENABLETS3FILE = 8; // 支持文件传输 private const int RI_HASASKDATA = 0x1000; //双向支持,待定 private const int RI_HIGHSPEED = 0x1002; //如果分析软件处理数据足够快,可以要求系统高速初始化代码 //一般不能调用。目前只有倚天2000服务器和网络版使用 private const int RI_SUPPORT_FUTURES = 0x1003; private const int RI_USERNAME = 0x1004; // 登陆用户 private const int RI_PASSWORD = 0x1005; // 登密码 private const int RI_IP = 0x1006; // 登陆用户 private const int RI_SUPPORT_ID = 0x1007; private const int RI_HIDE = 0x1008; // 登陆时候隐藏界面 private const int RI_SLEEP = 0x1009; // 登密码 private const int RI_ASKDATA = 0x1010; // 登密码 //软件完全按照倚天规范开发,调用本函数后,如果产品是期货 //tagRCV_REPORT_STRUCTEx结构中 //m_fAmount为成交金额, //m_fOpenInterest为持仓量 //m_fLastOpenInterest为昨日持仓量 //m_fLastSettle为昨结算,请不要使用这个变量,可能发生改变 //m_fLastSettle为当日结算(如果有)请不要使用这个变量,可能发生改变 //否则为持仓量 //不调用则m_fAmount为持仓量,上述几个字段为无效 private const int STKLABEL_LEN = 10; // 股号数据长度,国内市场股号编码兼容钱龙 private const int STKNAME_LEN = 32; // 股名长度 private const int STKLABEL_LEN_SKY = 48; //消息 private const int My_Msg_StkData = 0x8000 + 1; //软件完全按照倚天规范开发,调用本函数后,如果产品是期货 //tagRCV_REPORT_STRUCTEx结构中 //m_fAmount为成交金额, //m_fOpenInterest为持仓量 //m_fLastOpenInterest为昨日持仓量 //m_fLastSettle为昨结算,请不要使用这个变量,可能发生改变 //m_fLastSettle为当日结算(如果有)请不要使用这个变量,可能发生改变 //否则为持仓量 //不调用则m_fAmount为持仓量,上述几个字段为无效 //国债净价交易数据 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct GzLxBINData { public ushort m_wMarket; // 股票市场类型 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)] public string m_szLabel; // 股票代码,以'\0'结尾 public ushort m_LiXiDate; //开始计算利息的日期 public double m_fMoney100; //每100元的利息 public ushort m_DayNum; //利息计算天数 public Single m_fShowPrice; //票面价格 } [Flags] enum BYTE : byte { m_Dec = 4, m_Enabled = 1, m_VolFlag = 1, m_Other = 2 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RCV_REPORT_STRUCTEx1 { public ushort m_wMarket; // 股票市场类型 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)] public string m_szLabel; // 股票代码,以'\0'结尾 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKNAME_LEN - 15)] public string m_szName; // 股票名称,以'\0'结尾 BYTE BYTE; //BYTE m_Dec:4; //BYTE m_Enabled:1; //BYTE m_VolFlag:1; //BYTE m_Other:2; public ushort m_ID; public Single m_fOpenInterest; public Single m_fLastOpenInterest; public Single m_fLastSettle; public Single m_fLastClose; // 昨收 public Single m_fOpen; // 今开 public Single m_fHigh; // 最高 public Single m_fLow; // 最低 public Single m_fNewPrice; // 最新 public Single m_fVolume; // 成交量 public Single m_fAmount; // 成交额 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Single[] m_fBuyPrice; // 申买价1,2,3 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Single[] m_fBuyVolume; // 申买量1,2,3 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Single[] m_fSellPrice; // 申卖价1,2,3 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Single[] m_fSellVolume; // 申卖量1,2,3 } [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)] public struct RCV_REPORT_STRUCTEx { public ushort m_cbSize; // 结构大小 public uint m_time; // 交易时间 public ushort m_wMarket; // 股票市场类型 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)] public string m_szLabel; // 股票代码,以'\0'结尾 [FieldOffset(18)] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKNAME_LEN - 15)] public string m_szName; // 股票名称,以'\0'结尾 BYTE BYTE; //BYTE m_Dec:4; //BYTE m_Enabled:1; //BYTE m_VolFlag:1; //BYTE m_Other:2; public ushort m_ID; public Single m_fOpenInterest; public Single m_fLastOpenInterest; public Single m_fLastSettle; public Single m_fLastClose; // 昨收 public Single m_fOpen; // 今开 public Single m_fHigh; // 最高 public Single m_fLow; // 最低 public Single m_fNewPrice; // 最新 public Single m_fVolume; // 成交量 public Single m_fAmount; // 成交额 public Single m_fBuyPrice1; // 申买价1 public Single m_fBuyPrice2; // 申买价2 public Single m_fBuyPrice3; // 申买价3 public Single m_fBuyVolume1; // 申买量1 public Single m_fBuyVolume2; // 申买量2 public Single m_fBuyVolume3; // 申买量3 public Single m_fSellPrice1; // 申卖价1 public Single m_fSellPrice2; // 申卖价2 public Single m_fSellPrice3; // 申卖价3 public Single m_fSellVolume1; // 申卖量1 public Single m_fSellVolume2; // 申卖量2 public Single m_fSellVolume3; // 申卖量3 //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] //public Single[] m_fBuyPrice; // 申买价1,2,3 //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] //public Single[] m_fBuyVolume; // 申买量1,2,3 //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] //public Single[] m_fSellPrice; // 申卖价1,2,3 //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] //public Single[] m_fSellVolume; // 申卖量1,2,3 public Single m_fBuyPrice4; // 申买价4 public Single m_fBuyVolume4; // 申买量4 public Single m_fSellPrice4; // 申卖价4 public Single m_fSellVolume4; // 申卖量4 public Single m_fBuyPrice5; // 申买价5 public Single m_fBuyVolume5; // 申买量5 public Single m_fSellPrice5; // 申卖价5 public Single m_fSellVolume5; // 申卖量5 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)] public string m_szName2; public long m_IName; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RCV_REPORT_STRUCTEx2 { public ushort m_cbSize; // 结构大小 public ulong m_time; // 交易时间 public ushort m_wMarket; // 股票市场类型 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)] public string m_szLabel; // 股票代码,以'\0'结尾 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKNAME_LEN - 15)] public string m_szName; // 股票名称,以'\0'结尾 BYTE BYTE; //BYTE m_Dec:4; //BYTE m_Enabled:1; //BYTE m_VolFlag:1; //BYTE m_Other:2; public ushort m_ID; public Single m_fOpenInterest; public Single m_fLastOpenInterest; public Single m_fLastSettle; public Single m_fLastClose; // 昨收 public Single m_fOpen; // 今开 public Single m_fHigh; // 最高 public Single m_fLow; // 最低 public Single m_fNewPrice; // 最新 public Single m_fVolume; // 成交量 public Single m_fAmount; // 成交额 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Single[] m_fBuyPrice; // 申买价1,2,3 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Single[] m_fBuyVolume; // 申买量1,2,3 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Single[] m_fSellPrice; // 申卖价1,2,3 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Single[] m_fSellVolume; // 申卖量1,2,3 public Single m_fBuyPrice4; // 申买价4 public Single m_fBuyVolume4; // 申买量4 public Single m_fSellPrice4; // 申卖价4 public Single m_fSellVolume4; // 申卖量4 public Single m_fBuyPrice5; // 申买价5 public Single m_fBuyVolume5; // 申买量5 public Single m_fSellPrice5; // 申卖价5 public Single m_fSellVolume5; // 申卖量5 } //补充数据头 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RCV_EKE_HEADEx { public uint m_dwHeadTag; // = EKE_HEAD_TAG public ushort m_wMarket; // 市场类型 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)] public string m_szLabel; // 股票代码 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class AskDataStructHead { public ushort m_PacketType; public ushort m_wPacketNum; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct HisInfo { public ushort m_ID; public ushort m_HisType; } /// <summary> /// 需要重新定义 /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class AskDataStruct : AskDataStructHead { [MarshalAs(UnmanagedType.LPArray, SizeConst = 3)] IntPtr[] m_His; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class AskHisInfo { public byte m_DataType; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)] public string m_Extend; public long m_Start; public long m_End; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class ASK_HISTORY_STRUCTBase : AskDataStructHead { public ushort m_cbSize; // 结构大小 public ushort m_wMarket; // 市场类型 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)] public string m_szLabel; // 股票代码 } /// <summary> /// 需要重新定义 /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class ASK_HISTORY_STRUCT : ASK_HISTORY_STRUCTBase { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public AskHisInfo[] m_Info;//最多支持同时申请八种类型 } //补充日线数据 [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)] public struct RCV_HISTORY_STRUCTEx { [FieldOffset(0)] public long m_time; [FieldOffset(8)] public Single m_fOpen; //开盘 [FieldOffset(12)] public Single m_fHigh; //最高 [FieldOffset(16)] public Single m_fLow; //最低 [FieldOffset(20)] public Single m_fClose; //收盘 [FieldOffset(24)] public Single m_fVolume; //量 [FieldOffset(28)] public Single m_fAmount; //额 [FieldOffset(32)] public ushort m_wAdvance; //涨数,仅大盘有效 [FieldOffset(34)] public ushort m_wDecline; //跌数,仅大盘有效 [FieldOffset(32)] public Single m_fOI; [FieldOffset(0)] public IntPtr m_head; } //补充分时线数据 [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)] public struct RCV_MINUTE_STRUCTEx { [FieldOffset(0)] public long m_time; // UCT [FieldOffset(16)] public Single m_fPrice; [FieldOffset(20)] public Single m_fVolume; [FieldOffset(24)] public Single m_fAmount; [FieldOffset(0)] public IntPtr m_head; } //补充除权数据 [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)] public struct RCV_POWER_STRUCTEx { [FieldOffset(0)] public long m_time; // UCT [FieldOffset(16)] public Single m_fGive; // 每股送 [FieldOffset(20)] public Single m_fPei; // 每股配 [FieldOffset(24)] public Single m_fPeiPrice; // 配股价,仅当 m_fPei!=0.0f 时有效 [FieldOffset(28)] public Single m_fProfit; // 每股红利 [FieldOffset(0)] public IntPtr m_head; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RCV_SHAGZ_STRUCTEx { public ushort m_wMarket; // 市场类型 [MarshalAs(UnmanagedType.ByValArray, SizeConst = STKLABEL_LEN)] public string m_szLabel; // 股票代码 public ushort m_StartDate; //开始计算利息的日期 YYMMDD format public double m_fLiXi100RMB; //票面100员的 public ushort m_DayNum; public Single m_fPrice; } ////////////////////////////////////////////////////////////////////////////////// // 文件类型数据包头 // 注一: // m_wDataType == FILE_BASE_EX // m_dwAttrib = 股票证券市场,m_szFileName仅包含文件名 // m_FileTime = 基本面资料文件创建日期 // m_wDataType == FILE_NEWS_EX // m_dwAttrib = 消息来源,m_szFileName 包含目录的文件名,目录名为消息来源 // m_dwSerialNo = 序列号 // 如: "上交所消息\\0501Z012.TXT","新兰德\\XLD0001.TXT" // m_wDataType == FILE_HTML_EX // m_dwAttrib 保留, m_szFileName为URL // m_wDataType == FILE_SOFTWARE_EX // m_dwAttrib 分析软件类型, 用于初步判断 // m_szFileName 分析软件 ID 特征字符串 + '\\' + 文件名 // 如 "TongShi\\TS\\RECEIVE\\RECEIVE.EXE", // ID 特征字符串为 "TongShi", "TS\\RECEIVE\\RECEIVE.EXE" 为文件名 // 特征字符串 和 文件名及其含义由分析软件商定义 // 注二: // 数据文件循环播出,每个文件有唯一的序列号,以避免重复接收 [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)] public struct RCV_FILE_HEADEx { [FieldOffset(0)] public uint m_dwAttrib; // 文件子类型 [FieldOffset(4)] public uint m_dwLen; // 文件长度 [FieldOffset(8)] public uint m_dwSerialNo; // 序列号,对股评 [FieldOffset(8)] public long m_FileTime; // 文件创建时间 [FieldOffset(20)] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string m_szFileName; // 文件名 or URL } ////////////////////////////////////////////////////////////////////////////////// // 数据通知消息 //查询方式通知消息 // wParam = MsgPara_StkData 有股票数据 // wParam = MsgPara_File 有文件数据文件 //直接数据引用通知消息 // wParam = RCV_WPARAM; // lParam 指向 RCV_DATA结构; // 返回 1 已经处理, 0 未处理或不能处理,目前该返回值被忽略 // 注一: // 记录数表示行情数据和补充数据(包括 Header)的数据包数,对文件类型数据, = 1 // 注二: // 若 m_bDISK = FALSE, m_pData 为数据缓冲区指针 // ******** 数据共享,不能修改数据 ********** // m_bDISK = TRUE, m_pData 为该文件的存盘文件名,一般情况只有 // 升级软件等大文件用存盘方式 //[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)] [StructLayout(LayoutKind.Sequential)] public struct RCV_DATA { //[FieldOffset(0)] public int m_wDataType; // 文件类型 //[FieldOffset(4)] public int m_nPacketNum; // 记录数,参见注一 //[FieldOffset(8)] public RCV_FILE_HEADEx m_File; // 文件接口 //[FieldOffset(8)] //[MarshalAs(UnmanagedType.I4)] public int m_bDISK; // 文件是否已存盘的文件 public IntPtr ptr; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_REPORT_STRUCTEx[] m_pReport; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_REPORT_STRUCTEx1[] m_pReport1; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_REPORT_STRUCTEx2[] m_pReport2; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_HISTORY_STRUCTEx[] m_pDay; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_MINUTE_STRUCTEx[] m_pMinute; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.ByValArray)] //public RCV_POWER_STRUCTEx[] m_pPower; //[FieldOffset(292)] //[MarshalAs(UnmanagedType.AsAny)] //public object m_pData; // 参见注二 } private RichTextBox richTextBox1; private Button button2; private Button button1; // 注册函数 // 股票初始化 // 入口参数: // hWnd 处理消息的窗口句柄 // Msg 用户自定义消息 // nWorkMode 接口工作方式, 应等于 RCV_WORK_SENDMSG // 返回参数: // 1 成功 // -1 失败 [DllImport("jet158.dll")] private static extern int Stock_Init(IntPtr hWnd, uint Msg, int nWorkMode); // 退出,停止发送消息 // 入口参数: // hWnd 处理消息的窗口句柄,同 Stock_Init 的调用入口参数 // 返回参数: // 1 成功 // -1 失败 [DllImport("jet158.dll")] private static extern int Stock_Quit(IntPtr hWnd); ////////////////////////////////////////////////////////////////////////////////// // 行情接口 // 取已接收到的股票总数 [DllImport("jet158.dll")] private static extern int GetTotalNumber(); // 由序号取股票数据(扩展) // 入口参数: // nNo 序号 // pBuf 存放股票数据的缓冲区 // 返回参数: // NoStockData 无股票数据 // 注: // 该函数提供股票数据的主要数据;分析软件刚运行时,可以快速建立数据框架 [DllImport("jet158.dll")] private static extern int GetStockByNoEx(int nNo, [MarshalAs(UnmanagedType.LPStruct)]RCV_REPORT_STRUCTEx pBuf); // 由股号取股票数据(扩展) // 入口参数: // pszStockCode股票代号 // nMarket 证券市场 // pBuf 存放股票数据的缓冲区 // 返回参数: // NoStockData 无股票数据 // 注: // 该函数提供股票数据的主要数据;分析软件刚运行时,可以快速建立数据框架 //[DllImport("jet158.dll")] //private static extern int GetStockByCodeEx(char* pszStockCode, int nMarket, RCV_REPORT_STRUCTEx* pBuf); // 激活接收程序,进行设置 // 入口参数: // bShowWindow TRUE 显示窗口,进行设置 // FALSE 隐含窗口 // 返回参数: // 1 成功 // -1 失败 //[DllImport("jet158.dll")] //private static extern int SetupReceiver(BOOL bShowWindow); // 取得股票驱动信息 // 入口参数: // nInfo 索引 // pBuf 缓冲区 // 出口参数: // nInfo == RI_IDSTRING, 返回特征字符串长度, pBuf 为特征字符串 // 如: "TongShi_StockDrv_1.00" // nInfo == RI_IDCODE, 返回信息卡 ID 号, pBuf 为字符串形式的 ID 号 // 如: 0x78001234 "78001234" // nInfo == RI_VERSION, 返回信息卡版本号, pBuf 为字符串版本 // 如: 1.00 "1.00" // nInfo == RI_ERRRATE, 取信道误码, // nInfo == RI_STKNUM, 取上市股票总家数 [DllImport("jet158.dll")] private static extern int GetStockDrvInfo(int nInfo, [MarshalAs(UnmanagedType.AsAny)] object pBuf); public StockDataDriver() { InitializeComponent(); } protected override void WndProc(ref Message m) { switch (m.Msg) { case My_Msg_StkData: RCV_DATA pHeader = (RCV_DATA)m.GetLParam(typeof(RCV_DATA)); if (pHeader.ptr != IntPtr.Zero) { RCV_REPORT_STRUCTEx pRCV_REPORT_STRUCTEx = (RCV_REPORT_STRUCTEx)Marshal.PtrToStructure(pHeader.ptr, typeof(RCV_REPORT_STRUCTEx)); ushort nBufSize = pRCV_REPORT_STRUCTEx.m_cbSize; this.richTextBox1.Text = ""; switch (m.WParam.ToInt32()) { case RCV_REPORT: { for (int i = 0; i < pHeader.m_nPacketNum; i++) { RCV_REPORT_STRUCTEx report = (RCV_REPORT_STRUCTEx)Marshal.PtrToStructure(new IntPtr(pHeader.ptr.ToInt32() + nBufSize * i), typeof(RCV_REPORT_STRUCTEx)); this.richTextBox1.Text += String.Format("%6s %8s %8.3f %8.3f %8.3f %8.3f %8.3f %10.0f %10.f\n", new string(report.m_szLabelName, 0, 6), new string(report.m_szLabelName, 10, 16), report.m_fNewPrice, report.m_fOpen, report.m_fLastClose, report.m_fHigh, report.m_fLow, report.m_fVolume, report.m_fAmount); } break; } } } break; default: base.WndProc(ref m); break; } } public void GetKMIN5() { //IntPtr ptrs = Marshal.AllocHGlobal(128); //char[] SupportExtHQ = new char[128]; //int i = GetStockDrvInfo(RI_SUPPORTEXTHQ, SupportExtHQ); //string SupportExtHQ = Marshal.PtrToStringAnsi(ptrs); //MessageBox.Show(SupportExtHQ.to); int ok = Stock_Init(this.Handle, My_Msg_StkData, RCV_WORK_SENDMSG); //ASK_HISTORY_STRUCT ask = new ASK_HISTORY_STRUCT(); //ask.m_wPacketNum = 1; //ask.m_wMarket = SH_MARKET_EX; //ask.m_szLabel = "600000"; ; //ask.m_PacketType = 23; //ask.m_wPacketNum = 1; //ask.m_Info = new AskHisInfo[8]; //AskHisInfo ahi = new AskHisInfo(); //ahi.m_Extend = ""; ////ahi.m_Extend[0] = (char)0; ////ahi.m_Extend[1] = (char)0; ////ahi.m_Extend[2] = (char)0; //ask.m_Info[0] = ahi; //ahi = new AskHisInfo(); //ahi.m_Extend = ""; //ask.m_Info[1] = ahi; //ahi = new AskHisInfo(); //ahi.m_Extend = ""; //ask.m_Info[2] = ahi; //ahi = new AskHisInfo(); //ahi.m_Extend = ""; //ask.m_Info[3] = ahi; //ahi = new AskHisInfo(); //ahi.m_Extend = ""; //ask.m_Info[4] = ahi; //ahi = new AskHisInfo(); //ahi.m_Extend = ""; //ask.m_Info[5] = ahi; //ahi = new AskHisInfo(); //ahi.m_Extend = ""; //ask.m_Info[6] = ahi; //ahi = new AskHisInfo(); //ahi.m_Extend = ""; //ask.m_Info[7] = ahi; //ask.m_Info[0].m_DataType = (byte)2; //ushort len = (ushort)(Marshal.SizeOf(typeof(ASK_HISTORY_STRUCTBase)) + ask.m_wPacketNum * Marshal.SizeOf(typeof(AskHisInfo))); //ask.m_cbSize = len; //IntPtr ptrs = Marshal.AllocHGlobal(len); //Marshal.StructureToPtr(ask, ptrs, true); //ok = GetStockDrvInfo(RI_ASKDATA, ask); //Marshal.FreeHGlobal(ptrs); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new StockDataDriver()); } private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(1040, 572); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(37, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // richTextBox1 // this.richTextBox1.Location = new System.Drawing.Point(3, 3); this.richTextBox1.Name = "richTextBox1"; this.richTextBox1.Size = new System.Drawing.Size(1021, 653); this.richTextBox1.TabIndex = 1; this.richTextBox1.Text = ""; // // button2 // this.button2.Location = new System.Drawing.Point(1050, 115); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(37, 23); this.button2.TabIndex = 2; this.button2.Text = "button2"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // // StockDataDriver // this.ClientSize = new System.Drawing.Size(1127, 668); this.Controls.Add(this.button2); this.Controls.Add(this.richTextBox1); this.Controls.Add(this.button1); this.Name = "StockDataDriver"; this.ResumeLayout(false); } private void button1_Click(object sender, EventArgs e) { GetKMIN5(); } } 如下程序行出错: RCV_REPORT_STRUCTEx pRCV_REPORT_STRUCTEx = (RCV_REPORT_STRUCTEx)Marshal.PtrToStructure(pHeader.ptr, typeof(RCV_REPORT_STRUCTEx)); 请高手指教
我的语句是这样的(没有核对相应struct你我是否定义一致,可以参考我有关的帖子): RCV_DATA data=(RCV_DATA)m.GetLParam(typeof(RCV_DATA)); 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)); } [ StructLayout( LayoutKind.Explicit )] public struct RCV_REPORT_STRUCTExV3 { [ FieldOffset( 0 )]public System.UInt16 m_cbSize; // 结构大小 [ FieldOffset( 2 )]public System.UInt32 m_time; // 成交时间 [ FieldOffset( 6 )]public System.UInt16 m_wMarket; // 股票市场类型 [ MarshalAs( UnmanagedType.ByValArray, SizeConst=42)] [ FieldOffset( 8 )]public char[] m_szLabelName; // 股票代码,以'\0'结尾 // // [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=32 )] // [ FieldOffset( 18 )]public string m_szName; // 股票名称,以'\0'结尾 // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=STKLABEL_LEN-1 )] // public char[] m_szLabel; // 股票代码,以'\0'结尾 // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=STKNAME_LEN-1 )] // public char[] m_szName; // 股票名称,以'\0'结尾 [ FieldOffset( 50 )]public System.Single m_fLastClose; // 昨收 [ FieldOffset( 54 )]public System.Single m_fOpen; // 今开 [ FieldOffset( 58 )]public System.Single m_fHigh; // 最高 [ FieldOffset( 62 )]public System.Single m_fLow; // 最低 [ FieldOffset( 66 )]public System.Single m_fNewPrice; // 最新 [ FieldOffset( 70 )]public System.Single m_fVolume; // 成交量 [ FieldOffset( 74 )]public System.Single m_fAmount; // 成交额 // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )] [ FieldOffset( 78 )]public System.Single m_fBuyPrice1; // 申买价1 [ FieldOffset( 82 )]public System.Single m_fBuyPrice2; // 申买价2 [ FieldOffset( 86 )]public System.Single m_fBuyPrice3; // 申买价3 [ FieldOffset( 90 )]public System.Single m_fBuyVolume1; // 申买量1 [ FieldOffset( 94 )]public System.Single m_fBuyVolume2; // 申买量2 [ FieldOffset( 98 )]public System.Single m_fBuyVolume3; // 申买量3 [ FieldOffset( 102 )]public System.Single m_fSellPrice1; // 申卖价1 [ FieldOffset( 106 )]public System.Single m_fSellPrice2; // 申卖价2 [ FieldOffset( 110 )]public System.Single m_fSellPrice3; // 申卖价3 [ FieldOffset( 114 )]public System.Single m_fSellVolume1; // 申卖量1 [ FieldOffset( 118 )]public System.Single m_fSellVolume2; // 申卖量2 [ FieldOffset( 122 )]public System.Single m_fSellVolume3; // 申卖量3 // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )] // [ FieldOffset( 0 )]public System.Single[] m_fBuyVolume; // 申买量1,2,3 // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )] // [ FieldOffset( 0 )]public System.Single[] m_fSellPrice; // 申卖价1,2,3 // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )] // [ FieldOffset( 0 )]public System.Single[] m_fSellVolume; // 申卖量1,2,3 [ FieldOffset( 126 )]public System.Single m_fBuyPrice4; // 申买价4 [ FieldOffset( 130 )]public System.Single m_fBuyVolume4; // 申买量4 [ FieldOffset( 134 )]public System.Single m_fSellPrice4; // 申卖价4 [ FieldOffset( 138 )]public System.Single m_fSellVolume4; // 申卖量4 [ FieldOffset( 142 )]public System.Single m_fBuyPrice5; // 申买价5 [ FieldOffset( 146 )]public System.Single m_fBuyVolume5; // 申买量5 [ FieldOffset( 150 )]public System.Single m_fSellPrice5; // 申卖价5 [ FieldOffset( 154 )]public System.Single m_fSellVolume5; } [ StructLayout( LayoutKind.Sequential )] public struct RCV_DATA { public System.Int32 m_wDataType; // 文件类型 public System.Int32 m_nPacketNum; // 记录数,参见注一 public RCV_FILE_HEADEx m_File; // 文件接口 public System.Int32 m_bDISK; // [ MarshalAs( UnmanagedType.LPArray)] // public RCV_REPORT_STRUCTExV3[] rpt; // [ MarshalAs( UnmanagedType.AsAny)] public IntPtr ptr; // public rcvdata data; } [ StructLayout( LayoutKind.Sequential )] public struct RCV_FILE_HEADEx { public System.UInt32 m_dwAttrib; // 文件子类型 public System.UInt32 m_dwLen; // 文件长度 public System.UInt32 m_dwSerialNo; // 序列号 [ MarshalAs( UnmanagedType.ByValTStr , SizeConst=260 )] public string m_szFileName; // 文件名 or URL }
请教通视数据接口接收时时行情数据以及转为.txt格式 各位高手: 大家好! 我想接收数畅信息平台的股票价格行情数据,通过数据接口把数据时时接收到本地电脑中,数据格式转化为文本格式;(数据接口按照标准的通视格式) 然后,利用我的统计软件读这个文本格式的数据,进行统计计算。 有哪位高手能帮下忙?谢谢 zgq123
可以. WndProc部分参照下面的C#代码改一改: Code: protected override void WndProc(ref Message m) { try { int i, offset, stockrecsize; // short nIndex; //ushort wMarket; //SCMarket pscm; if (m.Msg == WM_USER) { // Console.WriteLine("开始接收。。。"); SCHead pHead = (SCHead)m.GetLParam(typeof(SCHead)); switch (pHead.m_nType) { case SC_MARKET: { SC_MarketReply psc = (SC_MarketReply)m.GetLParam(typeof(SC_MarketReply)); //Console.WriteLine("接收市场数据..."); offset = Marshal.SizeOf(typeof(SC_MarketReply)); stockrecsize = Marshal.SizeOf(typeof(StockInfo)); MKTDATA = psc.m_Market; for (i = 0; i < psc.m_Market.m_nCount; i++) { StockInfo record = (StockInfo)Marshal.PtrToStructure (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + Marshal.SizeOf(typeof(SC_MarketReply))), typeof(StockInfo)); SC_CODETABLE.addData(psc.m_Market.scmarketcode, (short)i, record); string dm = record.m_szLabel.Trim() + "." + psc.m_Market.scmarketcode.Trim().ToUpper(); if (!Symbols.Contains(dm)) Symbols.Add(dm);//zzz } if (!MarketDate.ContainsKey(psc.m_Market.scmarketcode)) MarketDate.Add(psc.m_Market.scmarketcode, DateTime.ParseExact(psc.m_Market.m_lDate.ToString(), "yyyyMMdd", null)); ; //Console.WriteLine(string.Format("市场{0},日期{1},证券数{2},开市{3},收市{4},时段数{5}", // psc.m_Market.scmarketcode, DateTime.ParseExact(psc.m_Market.m_lDate.ToString(), "yyyyMMdd", null), psc.m_Market.m_nCount, // psc.m_Market.m_OpenTime[0], psc.m_Market.m_CloseTime[0], psc.m_Market.m_PeriodCount)); } break; case SC_NOWDATA: { try { SC_NowDataReply pnr = (SC_NowDataReply)m.GetLParam(typeof(SC_NowDataReply)); //Console.WriteLine("正在接收 SC_nowdata"); if (pnr.m_nCount > 0) { offset = Marshal.SizeOf(typeof(SC_NowDataReply)); stockrecsize = Marshal.SizeOf(typeof(RCV_NOW_STRUCTEx)); for (i = 0; i < pnr.m_nCount; i++) { RCV_NOW_STRUCTEx record = (RCV_NOW_STRUCTEx)Marshal.PtrToStructure( new IntPtr(m.LParam.ToInt32() + offset + stockrecsize * i), typeof(RCV_NOW_STRUCTEx)); string wmarket = GetMarketName(record.m_sID.m_wMarket); string Symbol = SC_CODETABLE.GetSymbolCode(wmarket, record.m_sID.m_nIndex) + "." + wmarket.Trim(); //Console.WriteLine("{0}\t {1} \t{2}\t {3}\t{4} \t{5}\t{6}",record.m_sID.m_wMarket, record.m_sID.m_nIndex, //stock.m_szLabel ,stock .m_szName , record.m_fNewPrice , record.m_fVolume,record.m_lStroke); if (OnQuote != null) { OnQuote(this, Symbol, record); } } } } catch (Exception ex) { StMyFunction.textwrite(string.Format ("time:{0} \t SC_NOW 出错:{1} \t {2} case is :{3} ", DateTime.Now, ex.Message, ex.InnerException, ex.Source.ToString())); } } break; case SC_KLINE: { SC_KLineReply pk = (SC_KLineReply)m.GetLParam(typeof(SC_KLineReply)); offset = Marshal.SizeOf(typeof(SC_KLineReply)); stockrecsize = Marshal.SizeOf(typeof(RCV_HISTORY_STRUCTEx)); // StockInfo stockinfo = SC_CODETABLE.GetStockInfo(GetMarketName(pk.m_sID.m_wMarket), pk.m_sID.m_nIndex); //Console.WriteLine("{0}\t {1} \t ", stockinfo.m_szLabel, stockinfo.m_szName); List<RCV_HISTORY_STRUCTEx> Records = new List<RCV_HISTORY_STRUCTEx>(); switch (pk.m_wDataType) { case KLINE_DAYDATA: // Console.WriteLine("日线"); for (i = 0; i < pk.m_lDataCount; ++i) { RCV_HISTORY_STRUCTEx record = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + offset), typeof(RCV_HISTORY_STRUCTEx)); //DateTime mtime = new DateTime(1970, 1, 1).AddSeconds(record.m_time).ToLocalTime(); //Console.WriteLine("{0}\t {1}\t {2}\t ", mtime, record.m_fClose, record.m_fVolume); Records.Add(record); } if (OnSC_KLINE != null) { string wmarket1 = GetMarketName(pk.m_sID.m_wMarket); string symbol1 = SC_CODETABLE.GetSymbolCode(wmarket1, pk.m_sID.m_nIndex) + "." + wmarket1.Trim(); OnSC_KLINE(this, pk.m_Head.m_lIndex, symbol1, Records); } break; case KLINE_MIN5DATA: // Console.WriteLine("5Min :共有{0} 个记录", pk.m_lDataCount); for (i = 0; i < pk.m_lDataCount; ++i) { RCV_HISTORY_STRUCTEx record = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + offset), typeof(RCV_HISTORY_STRUCTEx)); //Console.WriteLine("{0}\t {1}\t {2}\t ", m_timeToDateTime(record.m_time), record.m_fClose, record.m_fVolume); Records.Add(record); } if (OnSC_KLINE != null) { string wmarket = GetMarketName(pk.m_sID.m_wMarket); string symbol = SC_CODETABLE.GetSymbolCode(wmarket, pk.m_sID.m_nIndex) + "." + wmarket.Trim(); OnSC_KLINE(this, pk.m_Head.m_lIndex, symbol, Records); } break; } } break; case SC_PANKOU: { //StMyFunction .textwrite(string .Format ("time:{0} 正在接收盘口数据....",DateTime .Now )); SC_PankouReply pp = (SC_PankouReply)m.GetLParam(typeof(SC_PankouReply)); offset = Marshal.SizeOf(typeof(SC_PankouReply)); stockrecsize = Marshal.SizeOf(typeof(RCV_PANKOU_STRUCTEx)); //StockInfo stockinfo = SC_CODETABLE.GetStockInfo(GetMarketName(pp.m_sID.m_wMarket), pp.m_sID.m_nIndex); //StMyFunction.textwrite(string.Format("{0}\t {1} \t reccount:{2} ", // stockinfo.m_szLabel, stockinfo.m_szName, pp, pp.m_lCount)); if (pp.m_lCount > 0) { List<RCV_PANKOU_STRUCTEx> Records = new List<RCV_PANKOU_STRUCTEx>(); for (i = 0; i < pp.m_lCount; ++i) { RCV_PANKOU_STRUCTEx record = (RCV_PANKOU_STRUCTEx)Marshal.PtrToStructure (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + offset), typeof(RCV_PANKOU_STRUCTEx)); //StMyFunction.textwrite(string.Format("{0}\t {1}\t {2}\t {3} \t", m_timeToDateTime(record.m_time), record.m_fNewPrice, record.m_fVolume, record.m_lStroke)); if (record.m_fNewPrice > 0) //最新价为零不增加list { Records.Add(record); } } //StMyFunction.textwrite(string.Format("fished !! count:{0} lindex:{1}", Records.Count, pp.m_Head.m_lIndex)); if (OnSC_PANKUO != null) { OnSC_PANKUO(this, pp.m_Head.m_lIndex, Records); } } } break; case SC_CQ: Console.WriteLine("SC_CQ"); break; case SC_IMTYPELIST: { SC_IMTypeReply pt = (SC_IMTypeReply)m.GetLParam(typeof(SC_IMTypeReply)); Console.WriteLine("SC_IMTypeReply"); } break; case SC_IMTITLE: SC_IMTitleReply ptr = (SC_IMTitleReply)m.GetLParam(typeof(SC_IMTitleReply)); Console.WriteLine("SC_IMTitleReply"); break; case SC_IMCONTENT: { Console.WriteLine("SC_imcontent"); } break; case SC_DL_KLINE: // 日k线下载 { SC_Download pdl = (SC_Download)m.GetLParam(typeof(SC_Download)); offset = Marshal.SizeOf(typeof(SC_Download)); stockrecsize = Marshal.SizeOf(typeof(RCV_HISTORY_STRUCTEx)); //Console.WriteLine("收到下载日线数据:"+pdl.m_lCount); for (i = 0; i < pdl.m_lCount; i++) { RCV_HISTORY_STRUCTEx record = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + offset), typeof(RCV_HISTORY_STRUCTEx)); //Console.WriteLine(string.Format("{0} \t {1} \t {2} \t \r\n", // m_timeToDateTime(record.m_time), record.m_fClose, record.m_fVolume)); } } break; case SC_DL_5MIN: // 五分钟k线下载 { SC_Download pdl = (SC_Download)m.GetLParam(typeof(SC_Download)); offset = Marshal.SizeOf(typeof(SC_Download)); stockrecsize = Marshal.SizeOf(typeof(RCV_HISTORY_STRUCTEx)); //Console.WriteLine(string.Format("收到下载五分钟数据 {0} ", pdl.m_lCount)); for (i = 0; i < pdl.m_lCount; i++) { RCV_HISTORY_STRUCTEx record = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + offset), typeof(RCV_HISTORY_STRUCTEx)); //Console.WriteLine(string.Format("{0} \t {1} \t {2} \t \r\n", // m_timeToDateTime(record.m_time), record.m_fClose, record.m_fVolume)); } } break; case SC_DL_CQ: // 除权数据下载 { SC_Download pdl = (SC_Download)m.GetLParam(typeof(SC_Download)); offset = Marshal.SizeOf(typeof(SC_Download)); stockrecsize = Marshal.SizeOf(typeof(RCV_POWER_STRUCTEx)); Console.WriteLine("收到下载除权数据 "); for (i = 0; i < pdl.m_lCount; i++) { RCV_POWER_STRUCTEx record = (RCV_POWER_STRUCTEx)Marshal.PtrToStructure (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + offset), typeof(RCV_POWER_STRUCTEx)); Console.WriteLine(string.Format("{0} \t {1} \t {2} \t \r\n", m_timeToDateTime(record.m_time), record.m_fGive, record.m_fPei)); } } break; case SC_DL_XX: // 资讯数据下载:交易所公告、信息地雷、新闻、综合等 { /*//SC_Download *pdl = (SC_Download *)lParam; switch ( pdl->m_cClass ) { case CLASS_JYSXX: sprintf(strText, "收到下载交易所公告 %d 个", pdl->m_lCount); break; case CLASS_STKINFO: sprintf(strText, "收到下载历史信息地雷 %d 个", pdl->m_lCount); break; case CLASS_NEWS: sprintf(strText, "收到下载新闻 %d 个", pdl->m_lCount); break; case CLASS_STOCKBASE: sprintf(strText, "收到下载F10 %d 个", pdl->m_lCount); break; case CLASS_MKTINFO: sprintf(strText, "收到下载综合资讯 %d 个", pdl->m_lCount); break; default: break; } SetDlgItemText(IDC_DOWN_LOAD, strText); } * */ Console.WriteLine("SC_DLXX"); } break; case SC_DL_TRACE: // 分笔明细下载 { SC_Download pdl = (SC_Download)m.GetLParam(typeof(SC_Download)); offset = Marshal.SizeOf(typeof(SC_Download)); stockrecsize = Marshal.SizeOf(typeof(RCV_PANKOU_STRUCTEx)); Console.WriteLine("收到下载分笔数据 " + pdl.m_lCount.ToString()); for (i = 0; i < pdl.m_lCount; i++) { RCV_PANKOU_STRUCTEx record = (RCV_PANKOU_STRUCTEx)Marshal.PtrToStructure (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + offset), typeof(RCV_PANKOU_STRUCTEx)); Console.WriteLine(string.Format("{0} \t {1} \t {2} \t {3} \r\n", m_timeToDateTime(record.m_time), record.m_fNewPrice, record.m_fVolume, record.m_fBuyPrice[0])); } } break; default: break; } } } catch (Exception ex) { StMyFunction.textwrite(string.Format("time:{0} \t接收出错:{1} \t case is :{2} ", DateTime.Now, ex.Message, ex.Source.ToString())); } base.WndProc(ref m); }
public string GetMarketName(ushort w_market) { string re_marketname = System.Text.Encoding.ASCII.GetString(BitConverter.GetBytes(w_market)); return re_marketname.Trim(); }
case 0x2201: //当前行情数据 try { SC_NowDataReply_s mNow = (SC_NowDataReply_s)mMessage.GetLParam(typeof(SC_NowDataReply_s)); if (mNow.m_nCount > 0) { offset = Marshal.SizeOf(typeof(SC_NowDataReply_s)); stockrecsize = Marshal.SizeOf(typeof(RCV_NOW_STRUCTEx)); for (num = 0; num < mNow.m_nCount; num++) { try { RCV_NOW_STRUCTEx record = (RCV_NOW_STRUCTEx)Marshal.PtrToStructure( new IntPtr(mMessage.LParam.ToInt32() + offset + (stockrecsize * num)), typeof(RCV_NOW_STRUCTEx)); wmarket = GetMarketName(record.m_sID.m_wMarket); Symbol = SC_CodeTable.GetSymbolCode(wmarket, record.m_sID.m_nIndex) + "." + wmarket.Trim(); if (this.m_NOW_delegate != null) { this.m_NOW_delegate(this, Symbol, record); } } catch { } }//for } } catch (Exception exception) { ClsTool.WriteToLog(string.Format("time:{0} \t SC_NOW 出错:{1} \t {2} case is :{3} ", new object[] { DateTime.Now, exception.Message, exception.InnerException, exception.Source.ToString() })); } break; 红色代码部分,经常出现异常 System.ExecutionEngineException 请高手修改一下!!!!!调用的是 数畅4.03(测试用户)
接收银江数据时无法捕获自定义消息 下面是一则短程序,逻辑步骤: 1、点击按钮,启动银江接口 2、在wndproc函数中捕获该消息,并加以处理 遇到的问题:在debug模式下,单步执行的时候可以捕捉用户自定义消息,但是在release模式下执行,看不到消息被捕获的log。 不知这是为何,请大侠指教。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.IO; namespace ntest { public partial class TongshiWindow : Form { private const int TSMSG = 0x8000 + 1; private const int RCV_WORK_SENDMSG = 4; public bool Drvloaded = false; public TongshiWindow() { using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"WriteLines2.txt")) { file.WriteLine("for debug use"); } InitializeComponent(); } [DllImport("Stock.dll")] public static extern int Stock_Init(int hWnd, uint Msg, int nWorkMode); [DllImport("Stock.dll")] public static extern int Stock_Quit(int hWnd); public void DrvInit() { Drvloaded = true; Stock_Init(this.Handle.ToInt32(), TSMSG, RCV_WORK_SENDMSG); } public void DrvQuit() { if (Drvloaded) { Stock_Quit(this.Handle.ToInt32()); Drvloaded = false; } } protected override void WndProc(ref Message m) { using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"WriteLines2.txt", true)) { file.WriteLine("msg:" + m.Msg.ToString() + " " + TSMSG.ToString() + " " + (m.Msg == TSMSG).ToString()); } if (m.Msg == TSMSG && Drvloaded) { MessageBox.Show("TSMSG"); } base.WndProc(ref m); } private void button1_Click(object sender, EventArgs e) { DrvInit(); } } }