为什么我的CTP程序能连接前置机,但是用ReqUserLogin()确登录不了?

Discussion in 'CTP' started by warmcrack, Dec 29, 2010.

  1. 为什么我的CTP程序能连接前置机,但是用ReqUserLogin()确登录不了。
    (一)我将MdSpi.h做如下定义
    #pragma once
    #include "ThostFtdcMdApi.h"
    //#import "thostmduserapi.dll" named_guids, raw_interfaces_only
    ////////////////////////
    #include "iostream"
    #pragma warning(disable : 4996)
    #pragma comment(lib,"thostmduserapi.lib")
    //#import "thostmduserapi.DLL" no_namespace
    // USER_API参数
    ///////////////////
    class CMdSpi : public CThostFtdcMdSpi
    {
    public:
    CWnd * m_mdwnd;
    ///错误应答
    virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo,int nRequestID, bool bIsLast)
    {
    ::AfxMessageBox("错误应答");
    }
    ///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。
    ///@param nReason 错误原因
    /// 0x1001 网络读失败
    /// 0x1002 网络写失败
    /// 0x2001 接收心跳超时
    /// 0x2002 发送心跳失败
    /// 0x2003 收到错误报文
    virtual void OnFrontDisconnected(int nReason)
    {
    ::AfxMessageBox("前置机已经断开连接");//做测试用的,呵呵
    }
    ///心跳超时警告。当长时间未收到报文时,该方法被调用。
    ///@param nTimeLapse 距离上次接收报文的时间
    virtual void OnHeartBeatWarning(int nTimeLapse)
    {
    ::AfxMessageBox("OnHeartBeatWarning");
    }

    ///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。
    virtual void OnFrontConnected()
    {
    /////////////////////////////////////
    AfxMessageBox("建立连接!");
    }

    ///登录请求响应
    virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
    {
    ::AfxMessageBox("登录请求响应!");
    }

    ///订阅行情应答
    virtual void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
    {
    ::AfxMessageBox("OnRspSubMarketData");

    }

    ///取消订阅行情应答
    virtual void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
    {
    ::AfxMessageBox("OnRspSubMarketData");
    }

    ///深度行情通知
    virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)
    {
    ::AfxMessageBox("OnRtnDepthMarketData");
    }
    private:
    // void ReqUserLogin();
    // void SubscribeMarketData();
    // bool IsErrorRspInfo(CThostFtdcRspInfoField *pRspInfo);
    CMdSpi *m_pUserSpi;
    CThostFtdcMdApi *m_pUserApi;

    };


    并将上述头文件添加在我的工程文件中。
    但是不添加 MdSpi.cpp文件。

    (二)在我的dialog对话框程序的init中
    加入如下代码:


    CThostFtdcMdApi* pUserApi=CThostFtdcMdApi::CreateFtdcMdApi();
    CMdSpi* pUserSpi = new CMdSpi();
    pUserApi->RegisterSpi((CMdSpi*)pUserSpi); // 注册事件类
    char FRONT_ADDR[] = "tcp://asp-sim2-md1.financial-trading-platform.com:26213";// 行情前置地址;
    pUserApi->RegisterFront(FRONT_ADDR); // connect
    pUserApi->Init(); //建立前后台连接//
    /////////////////////////////////////
    TThostFtdcBrokerIDType BROKER_ID = "2030";// 经纪公司代码
    TThostFtdcInvestorIDType INVESTOR_ID = "xxxxxx";// 投资者代码
    TThostFtdcPasswordType PASSWORD = "xxxxxx";// 用户密码
    // 请求编号///////////////
    int iRequestID = 0;
    ////////////////////
    CThostFtdcReqUserLoginField req;
    memset(&req, 0, sizeof(req));
    strcpy(req.BrokerID, BROKER_ID);
    strcpy(req.UserID, INVESTOR_ID);
    strcpy(req.Password, PASSWORD);
    int iResult = -1;
    iResult = pUserApi->ReqUserLogin(&req,++iRequestID);
    CString aaa = pUserApi->GetTradingDay();
    MessageBox(aaa,"");

    (三)结果如下:
    MdSpi.h中的这个函数有了响应,弹出"检录连接"对话框。
    应该是pUserApi->Init(); //建立前后台连接//
    执行的结果.
    virtual void OnFrontConnected()
    {
    /////////////////////////////////////
    AfxMessageBox("建立连接!");
    }
    但是:
    iResult = pUserApi->ReqUserLogin(&req,++iRequestID);
    得到的iResult 总是-1; 注:用户名,密码肯定不会错的,我在海风CTP下使用过。
    CString aaa = pUserApi->GetTradingDay();
    这时aaa="19800100"

    谁能告诉我什么原因?
    谢谢!!!!!!!!
     
  2. 不要在On**()这样的方法中使用GUI操作(例如,AfxMessageBox) 看看
     
  3. 还是不行!!!!!!
     
  4. 上期技术的 .H文件 lib,dll库直接加载在MFC中好像无法使用

    上期技术的 .H文件 lib,dll库直接加载在MFC中好像无法直接使用。
    该如何改造才能在VC6.0 mfc下使用呢?????????
     
  5. 行情端不用用户名和密码的吧
     
  6. 请将 ReqUserLogin 放到 OnFrontConnected 里面。
     
  7. 谢谢!已经可以了,好像必须将LOGIN放在 OnFrontConnected