使用破解的login_message快速修复bad_cast异常

时间:2013-10-22 11:46:38

标签: c++ login quickfix

我找到this解决方案,通过C ++使用用户名和密码在QuickFIX中创建登录部分。

使用Visual Studio 2012 Express我必须进行额外的包含以避免“错误C2680:'FIX44 :: Logon&' :dynamic_cast的无效目标类型“显示Visual Studio 2012 Express如何动态转换:

#include "../../include/quickfix/fix44/Logon.h"     // for dynamic_cast in Visual C++
void Application::toAdmin( FIX::Message& message, const FIX::SessionID& sessionID)
{
    if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType))
    {
        FIX44::Logon& logon_message = dynamic_cast<FIX44::Logon&>(message);
        logon_message.setField(FIX::Username("xxx"));
        logon_message.setField(FIX::Password("yyy"));
    }
} 

使用此包含,不会发生编译时错误 - 但在运行时,我得到: “Microsoft C ++异常:std :: bad_cast在内存位置0x02A0ED70。”

到目前为止,我已调试过,显示的dynamic_cast语句负责运行时错误。

我的问题是,如何解决此运行时错误并使用Visual Studio 2012 Express使用用户名和密码登录?

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的方法,这种方法在我的项目中使用并且像魅力一样工作:

void MarketApplication :: toAdmin(FIX :: Message&amp; message,const FIX :: SessionID&amp; sessionID) {

if (FIELD_GET_REF(message.getHeader(), MsgType) == FIX::MsgType_Logon)
{
    const FIX::Dictionary& session_settings = m_settings.get(sessionID);

    if (session_settings.has("TargetSubID"))
        message.setField(FIX::TargetSubID(session_settings.getString("TargetSubID")));

    if (session_settings.has("Username"))
        message.setField(FIX::Username(session_settings.getString("Username")));

    if (session_settings.has("Password"))
        message.setField(FIX::Password(session_settings.getString("Password")));
}

}

主要优点是您可以在会话配置中指定密码/登录,避免任何硬编码

相关问题