通视实时服务器源码

Discussion in 'General Topics on Software and Data' started by tom_sh, Sep 18, 2005.

  1. tom_sh 你好:


    发消息(一个指针lp)到另一个a.exe程序,这个a.exe程序根据消息来的lp参数读一些内存时报错,说该地址内存不许读,咋办?

    谢谢
     
  2. 请问金卡绣球是否知道分析家2005除权数据结构? :D
     
  3. windows不同进程控制的内存空间好象是不能直接互相访问的,好象可以通过申请创建该内存空间的THREAD,以一个回调函数的方式来取数,应该是API HOOK的一种了。技术细节我是不懂的。在C#下这些东西都被封装了,所以处理起来或者很简单(如传递一个结构),或者根本行不通(如传递窗口控件资源)。

    此外,关于FREESTAR发送的WINDOWS消息。自定义常数uMsg是启动FREESTAR的stock_init入口参数之一,用于验证消息发送者的身份。wParam是数据类别标识符,即为即时行情或数据文件,数据文件又分若干种(请参考通视规范)。lParam是数据结构指针,用于转换具体数据。
     
  4. 谢谢各位大侠.问题找到了.

    没在form-load里调用函数.呵呵.好笑.先谢谢各位大侠的无私帮助.以后可能还会遇到问题.希望各位继续指教.谢谢了 :D
     
  5. 谢谢,是这个情况。

    帮想一下,FREESTAR发msg、lParam这个怎么实现,以便后面软件都正常运行。
     
  6. stock_init调用后(直到调用stock_quit结束行情接收),FREESTAR(或者其他通视兼容程序)就会向启动窗口循环发送WINDOWS消息(该消息类包含msg,wParam,lParam等引用),中间没有任何干涉机制。一般启动窗口都有一个WINDOWS消息处理函数,当收到任何WINDOWS消息这个函数都会自动被调用,相当于一个事件handler,数据转换和接收代码就放在其中。
     
  7. 战战兢兢的说:copymemory是否可以?

    曾经在书上看过.不过我这样的菜鸟看了也不是很明白.请大侠试试看了.不对的话别骂. :oops:
     
  8. to tom大侠

    vb里面基本接触不到消息机制.全部被封装的死死的.我也是没办法的办法才调用了那么多的api函数.现在很后悔当初为什么选择了学习vb而不是vc.呵呵.要是当初学习的是vc就不用那么费劲了.谢谢你了.
     
  9. 你先慢慢试一下,应该可以的,数据都摆在门口了
     
  10. 大侠,下载分笔数据的数据结构是下面这个吗?

    大侠,下载分笔数据的数据结构是下面这个吗?
    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;
     
  11. 是分笔的结构,但这种数据是广播方式发送和接收的,不是一般意义上的下载
     
  12. 再次请教。

    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取得第一个指针里的内容才能获得第二个指针,通过第二个指针才能知道数据?
    谢谢了。
     
  13. wparam传递的消息类型当为0x3f001234时表示传递的股票分笔交易数据结构,当为0x3f001235时表示传递的是历史行情数据文件。lparam传递的是数据头地址,数据头地址指向的是RCV_DATA数据结构,获取该结构后可获得指向真正数据项存放位置的指针,即union部分。
     
  14. 谢谢了啊.

    不过我看了一下demo,好象没有对m_szFileName[MAX_PATH]定义具体的字符长度,我用vb必须知道从起始地址间隔多少字节后才是指向数据的地址.所以这个有多少字节还请帮个忙.如果是定义的,怎么定义?
     
  15. MAX_PATH是C++编译器的默认include头文件参数,你用255或256试试。
     
  16. 谢谢了.

    谢谢了.还是不明白是256个字节,还是256位(32个字节)?
     
  17. Re: 谢谢了.

    字节
     
  18. 谢谢.还要继续请教.

    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\好象分笔数据的下载每一只股票的数据只传递一次.那么只能传递第一笔啊,余下的怎么办呢?
    再次感谢.
     
  19. 1) RCV_REPORT_STRUCTEx是分笔数据结构,RCV_MINUTE_STRUCTEx是分时数据结构;
    2)分笔数据一有行情更新(上交所每4-6秒更新一次,深圳6秒)就发送一次,即最新的开高低收量和盘口,自己可以建一个库保存每一笔分笔数据。分时数据以一个数组的形式一次性提供,没有更新一说(有的驱动定时如X分钟自动更新广播一次)。再强调一次,粉笔数据是动态更新的,分时数据是“点播(通过用户界面或程序调用API)下载”的。
    3)希望你能为其他新手做一个FAQ贴,把这类问题汇总和整理出来。
     
  20. 谢谢

    我一定会的.再次感谢.