windows不同进程控制的内存空间好象是不能直接互相访问的,好象可以通过申请创建该内存空间的THREAD,以一个回调函数的方式来取数,应该是API HOOK的一种了。技术细节我是不懂的。在C#下这些东西都被封装了,所以处理起来或者很简单(如传递一个结构),或者根本行不通(如传递窗口控件资源)。 此外,关于FREESTAR发送的WINDOWS消息。自定义常数uMsg是启动FREESTAR的stock_init入口参数之一,用于验证消息发送者的身份。wParam是数据类别标识符,即为即时行情或数据文件,数据文件又分若干种(请参考通视规范)。lParam是数据结构指针,用于转换具体数据。
stock_init调用后(直到调用stock_quit结束行情接收),FREESTAR(或者其他通视兼容程序)就会向启动窗口循环发送WINDOWS消息(该消息类包含msg,wParam,lParam等引用),中间没有任何干涉机制。一般启动窗口都有一个WINDOWS消息处理函数,当收到任何WINDOWS消息这个函数都会自动被调用,相当于一个事件handler,数据转换和接收代码就放在其中。
to tom大侠 vb里面基本接触不到消息机制.全部被封装的死死的.我也是没办法的办法才调用了那么多的api函数.现在很后悔当初为什么选择了学习vb而不是vc.呵呵.要是当初学习的是vc就不用那么费劲了.谢谢你了.
大侠,下载分笔数据的数据结构是下面这个吗? 大侠,下载分笔数据的数据结构是下面这个吗? 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]; // 股票名称,以'\0'结尾 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 } RCV_REPORT_STRUCTEx, *PRCV_REPORT_STRUCTEx;
再次请教。 wparam传递的消息类型是不是=0x3f001235是表示传递的股票交易数据,lparam传递的是数据地址。数据地址指向的是 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_HISTORY_STRUCTEx * m_pDay; RCV_MINUTE_STRUCTEx * m_pMinute; RCV_POWER_STRUCTEx * m_pPower; void * m_pData; // 参见注二 }; } RCV_DATA,*PRCV_DATA; 这个结构的首地址。m_pReport指向的才是分笔数据的首地址。它指向的是: 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]; // 股票名称,以'\0'结尾 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 } RCV_REPORT_STRUCTEx, *PRCV_REPORT_STRUCTEx; 也就是我要先用vb取得第一个指针里的内容才能获得第二个指针,通过第二个指针才能知道数据? 谢谢了。
wparam传递的消息类型当为0x3f001234时表示传递的股票分笔交易数据结构,当为0x3f001235时表示传递的是历史行情数据文件。lparam传递的是数据头地址,数据头地址指向的是RCV_DATA数据结构,获取该结构后可获得指向真正数据项存放位置的指针,即union部分。
谢谢了啊. 不过我看了一下demo,好象没有对m_szFileName[MAX_PATH]定义具体的字符长度,我用vb必须知道从起始地址间隔多少字节后才是指向数据的地址.所以这个有多少字节还请帮个忙.如果是定义的,怎么定义?
谢谢.还要继续请教. 1\下载的分笔数据其结构是什么?是这个: typedef struct tagRCV_REPORT_STRUCTEx { WORD m_cbSize; // 结构大小 2 time_t m_time; // 交易时间 4 WORD m_wMarket; // 股票市场类型 2 char m_szLabel[STKLABEL_LEN]; // 股票代码,以'\0'结尾 10 char m_szName[STKNAME_LEN]; // 股票名称,以'\0'结尾 32 float m_fLastClose; // 昨收 4 float m_fOpen; // 今开 4 float m_fHigh; // 最高 4 float m_fLow; // 最低 4 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 } RCV_REPORT_STRUCTEx, *PRCV_REPORT_STRUCTEx; 还是这个: //补充分时线数据 typedef union tagRCV_MINUTE_STRUCTEx { struct{ time_t m_time; // UCT float m_fPrice; float m_fVolume; float m_fAmount; }; RCV_EKE_HEADEx m_head; }RCV_MINUTE_STRUCTEx,*PRCV_MINUTE_STRUCTEx; 2\好象分笔数据的下载每一只股票的数据只传递一次.那么只能传递第一笔啊,余下的怎么办呢? 再次感谢.
1) RCV_REPORT_STRUCTEx是分笔数据结构,RCV_MINUTE_STRUCTEx是分时数据结构; 2)分笔数据一有行情更新(上交所每4-6秒更新一次,深圳6秒)就发送一次,即最新的开高低收量和盘口,自己可以建一个库保存每一笔分笔数据。分时数据以一个数组的形式一次性提供,没有更新一说(有的驱动定时如X分钟自动更新广播一次)。再强调一次,粉笔数据是动态更新的,分时数据是“点播(通过用户界面或程序调用API)下载”的。 3)希望你能为其他新手做一个FAQ贴,把这类问题汇总和整理出来。