向zwz版主请教,有关数畅问题无法在wndproc中取得自定义消息的问题

Discussion in 'Julia / MATLAB / SAS' started by boblaw, Jun 12, 2011.

  1. 我的代码如下,调用SCStock_Init方法后,重写windows窗体的WndProc方法后,始终无法截获自定义的消息,debug许久,不明所以。无奈下,向zwz及坛内各位求救,感激不尽!
    此程序执行时,可以成功启动数畅接口,数畅也能显示分析软件是我的程序,但是消息处理时,始终截获不到!!

    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace SCTest
    {
        /// <summary>
        /// 引擎初始化包        // 发出初始化请求,调用SCInit时使用,无对应返回包
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SC_InitAsk
        {
            public SCHead m_Head;
            public UInt32 m_dwSoftware;         // 分析软件标识,由数畅分配
            public IntPtr m_hWnd;               // 用来接收数据的窗口句柄
            public UInt32 m_nMsg;               // 用来接收数据的消息
        }
    
        /// <summary>
        /// 请求包头
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SCHead
        {
            public UInt16 m_nType;          // 请求/应答类型,SC_MARKET、SC_IMCONTENT等
            public char m_cStatus;          // 当为应答包时,m_cStatus=1成功,m_cStatus=0失败,m_cStatus=2离线
            /// <summary>
            /// 包的唯一索引。不要设为0,请求的时候赋值,并在应答包中
            /// 判断是否与请求包中的相同,如果不同,则表示不是这个请求包对应的应答包
            /// 如果这个值为0,表示不是请求引起的数据变化
            /// </summary>
            public Int32 m_lIndex;
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct StockInfo
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public char[] m_szLabel;	                            // 股票代码,以'\0'结尾
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public char[] m_szName;	                                // 股票名称,以'\0'结尾
            public Int16 m_nHand;                                   // 每手股数
        }
    
        /// <summary>
        /// 市场内容
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SCMarket
        {
            public UInt16 m_wMarket;                                //市场代码
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public char[] m_Name;	                                // 市场名称
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public char[] m_CShortName;	                            // 中文简称
            public UInt32 m_lProperty;                              //市场属性(未定义)
            public UInt32 m_lDate;                              //数据日期(20030114)
            public UInt16 m_PeriodCount;                            //交易时段个数
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public UInt16[] m_OpenTime;                               //开市时间 1,2,3,4,5
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public UInt16[] m_CloseTime;                              //收市时间 1,2,3,4,5
            public UInt16 m_nCount;                                 //收市时间 1,2,3,4,5
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
            public StockInfo[] m_Siif;
        }
    
        /// <summary>
        /// //证券标识
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct StockID
        {
            public UInt16 m_wMarket;            //市场代码
            public Int16 m_nIndex;              //在该市场SCMarket::m_Siff中的偏移
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RCV_NOW_STRUCTEx
        {
            public StockID m_sID;
            public Int32 m_time;
    
            public float m_fLastClose;					// 昨收
            public float m_fOpen;						// 今开
            public float m_fHigh;						// 最高
            public float m_fLow;						// 最低
            public float m_fNewPrice;					// 最新
            public float m_fVolume;						// 成交量
            public float m_fAmount;						// 成交额
    
            Int32 m_lStroke;						    // 本次实际成交笔数
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public float[] m_fBuyPrice;					// 申买价1,2,3,4,5
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public float[] m_fBuyVolume;				// 申买量1,2,3,4,5
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public float[] m_fSellPrice;				// 申卖价1,2,3,4,5
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public float[] m_fSellVolume;				// 申卖量1,2,3,4,5
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RCV_PANKOU_STRUCTEx
        {
            public Int32 m_time;                        // UCT
    
            public float m_fHigh;						// 最高
            public float m_fLow;						// 最低
            public float m_fNewPrice;					// 最新
            public float m_fVolume;						// 成交量
            public float m_fAmount;						// 成交额
    
            public Int32 m_lStroke;						// 本次实际成交笔数
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public float[] m_fBuyPrice;					// 申买价1,2,3
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public float[] m_fBuyVolume;				// 申买量1,2,3,
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public float[] m_fSellPrice;				// 申卖价1,2,3
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public float[] m_fSellVolume;				// 申卖量1,2,3
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RCV_HISTORY_STRUCTEx
        {
            public Int32 m_time;                // UCT
    
            public float m_fOpen;			    //开盘
            public float m_fHigh;			    //最高
            public float m_fLow;				//最低
            public float m_fClose;			    //收盘
            public float m_fVolume;			    //量
            public float m_fAmount;			    //额
            public UInt16 m_wAdvance;			//涨数,仅大盘有效
            public UInt16 m_wDecline;			//跌数,仅大盘有效
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RCV_POWER_STRUCTEx
        {
            public Int32 m_time;	 // UCT
            public float m_fGive;	 // 每股送
            public float m_fPei;	 // 每股配
            public float m_fPeiPrice;	 // 配股价,仅当 m_fPei!=0.0f 时有效
            public float m_fProfit;	 // 每股红利
        }
    
        /// <summary>
        /// 请求包和应答包  // 这个包无需请求即可收到,在市场信息变化的时候就可收到
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SC_MarketReply
        {
            public SCHead m_Head;
            public SCMarket m_Market;
        }
    
        /// <summary>
        /// // 这个包无需请求即可收到。数据有更新,会自动发送
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SC_NowDataReply
        {
            public SCHead m_Head;
            public Int16 m_nCount;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
            public RCV_NOW_STRUCTEx[] m_Now;
        }
    
        /// <summary>
        /// 请求一天盘口数据,现支持当天,历史盘口将通过下载获得
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SC_PankouAsk
        {
            public SCHead m_Head;
            public StockID m_sID;
            public Int32 m_lDate;               // FORMAT: 20010305
        }
    
        /// <summary>
        /// 请求一天盘口数据,现支持当天,历史盘口将通过下载获得
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SC_PankouReply
        {
            public SCHead m_Head;
            public StockID m_sID;
            public Int32 m_lDate;			// FORMAT: 20010305
            public float m_fLastClose;			// 昨收
            public float m_fOpen;			// 今开
            public Int32 m_lCount;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
            public RCV_PANKOU_STRUCTEx[] m_Data;
    
        }
    
    
        // 注意:
        // 1、由于服务器的设置,可能只能收到最近某一时段的数据,更多的数据,可以通过下载获得。
        // 2、对于K线请求包,当表示日线时,long的格式为yyyymmdd,
        // 3、对于K线请求包,当为五分钟线时,long的格式如下面这个TDate结构所示
        //	struct TDate {		// 五分钟时间格式
        //		unsigned long m_Minute : 6;
        //		unsigned long m_Hour : 5;
        //		unsigned long m_Day  : 5;
        //		unsigned long m_Month : 4; 
        //		unsigned long m_Year : 12;
        //	};
        // 4、关于时间的转行,我们提供例子中有示范代码,可参考。
        // 5、对K线应答包,日线和无分钟的时间统一为time_t格式,已经包含日期和分钟信息。
    
        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SC_KLineAsk
        {
            public SCHead m_Head;
            public StockID m_sID;
            public UInt16 m_wDataType;		// KLINE_DAYDATA or KLINE_MIN5DATA
            public Int32 m_tBegin;			// 开始时间或位置,0表示从第一个数据开始
            public Int32 m_tEnd;			// 结束时间或请求数量,0表示直到结束
    
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct SC_KLineReply
        {
            public SCHead m_Head;
            public StockID m_sID;
            public UInt16 m_wDataType;		// KLINE_DAYDATA or KLINE_MIN5DATA
            public Int32 m_lDataCount;			// m_pData数量
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
            public RCV_HISTORY_STRUCTEx[] m_pData;
        }
    
        /// <summary>
        /// 除权数据不校验,总是以服务器的为准
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct SC_CQAsk
        {
            public SCHead m_Head;
            public StockID m_sID;
        }
    
        public struct SC_CQReply
        {
            public SCHead m_Head;
            public StockID m_sID;
            public Int16 m_nCount;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
            public RCV_POWER_STRUCTEx[] m_pData;// m_head不使用
        }
    
        public unsafe class SCStock
        {
            public const int STKLABEL_LEN = 10;	// 股号数据长度,国内市场股号编码兼容钱龙
            public const int STKNAME_LEN = 32;	// 股名长度
            public const int TITLE_LEN = 64;		// 信息地雷标题长度
    
            public const int SC_INIT = 0x2001;	// SCInit调用
    
            public const int SC_CLEAR_PREVREQ = 0x2101;	// 撤销前面的所有请求,建议在发请求(或组合请求)之前调用
            public const int SC_MARKET = 0x2131;	// 请求指定市场的信息,无需请求,有变化就会自动发送
    
            public const int SC_NOWDATA = 0x2201;
    
            public const int SC_PANKOU = 0x2301;	// 请求盘口数据,对应:time_t m_time,建议使用这个。
    
            public const int SC_IMTYPELIST = 0x2401;	// 请求信息地雷信息分类表
            public const int SC_IMTITLE = 0x2402;	// 请求信息地雷标题列表
            public const int SC_IMCONTENT = 0x2403;	// 请求信息地雷数据(f10, 交易所公告、实时和历史的个股信息等)
    
            public const int SC_KLINE = 0x2501;	// 请求K线数据(日线)
    
            public const int SC_CQ = 0x2601;	// 请求除权数据
    
            public const int SC_DL_KLINE = 0x2701;	// K线数据下载
            public const int SC_DL_CQ = 0x2702;	// 除权数据下载
            public const int SC_DL_XX = 0x2703;	// 信息下载,如F10、交易所公告、新闻等
            public const int SC_DL_TRACE = 0x2704;	// 明细数据,旧的,新版已不用
            public const int SC_DL_5MIN = 0x2705;	// 5分钟K线下载
    
            //define for SC_KLineAsk::m_wDataType
            public const UInt16 KLINE_DAYDATA = 0;//日线
            public const UInt16 KLINE_MIN5DATA = 1;	//5分钟线
    
            [DllImport(@"C:\数畅信息服务平台\SCStock.dll")]
            private static extern bool SCInit(void* sca, Int32 nsize);
    
            [DllImport(@"C:\数畅信息服务平台\SCStock.dll")]
            private static extern bool SCAskData(void* pAsk, Int32 nsize);
    
            [DllImport(@"C:\数畅信息服务平台\SCStock.dll")]
            private static extern void SCQuit();
    
            public static bool SCStock_Init(IntPtr hwnd, UInt32 nMsg)
            {
                SC_InitAsk sca; //= new SC_InitAsk();
                sca.m_dwSoftware = 0x567890;
                sca.m_Head.m_nType = SCStock.SC_INIT;
                sca.m_Head.m_cStatus = Convert.ToChar(1);
                sca.m_nMsg = nMsg;
                sca.m_hWnd = hwnd;
                return SCStock.SCInit(&sca, Marshal.SizeOf(sca));
            }
    
            public static void SCStock_Quit()
            {
                SCQuit();
            }
    
        }
    
    }
    
    窗体程序如下:
    Code:
    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;
    
    namespace SCTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private UInt32 My_Msg_StkData;
    
            private void button1_Click(object sender, EventArgs e)
            {
                SCStock.SCStock_Init(this.Handle, My_Msg_StkData);
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                SCStock.SCStock_Quit();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                My_Msg_StkData =Win32API.RegisterWindowMessage("BobStockDEMO");
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                SCStock.SCStock_AskPower();
            }
    
            SCMarket MKTDATA;
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == My_Msg_StkData)
                {
                    //此处始终不能执行
                    SCHead pHead = (SCHead)m.GetLParam(typeof(SCHead));
                    switch (pHead.m_nType)
                    {
                        case SCStock.SC_MARKET:
                            break;
                        case SCStock.SC_NOWDATA:
                            break;
                        case SCStock.SC_KLINE:
                            break;
                        case SCStock.SC_PANKOU:
                            break;
                        case SCStock.SC_CQ:
                            break;
                        case SCStock.SC_IMTYPELIST:
                            break;
                        case SCStock.SC_IMTITLE:
                            break;
                        case SCStock.SC_IMCONTENT:
                            break;
                        case SCStock.SC_DL_KLINE:		// 日k线下载
                            break;
                        case SCStock.SC_DL_5MIN:		// 五分钟k线下载
                            break;
                        case SCStock.SC_DL_CQ:			// 除权数据下载
                            break;
                        case SCStock.SC_DL_XX:			// 资讯数据下载:交易所公告、信息地雷、新闻、综合等
                            break;
                        case SCStock.SC_DL_TRACE:
                            break;
                        default:
                            break;
                    }
                }
            }
        }
    }
    
     
  2. zwz

    zwz

    两处注意一下:SCStock要继承自UserControl或Form,WndProc要重写的是SCStock的WndProc方法。
    建议先把论坛上现成的例子代码调通,然后再作大的修改。