0

我找到了这个解决方案,通过 C++ 使用用户名和密码在 QuickFIX 中进行登录部分。

使用 Visual Studio 2012 Express 时,我必须添加一个额外的 include 以避免“错误 C2680: 'FIX44::Logon &' : invalid target type for 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++ 异常:内存位置 0x02A0ED70 处的 std::bad_cast。”

据我调试,显示的 dynamic_cast 语句负责运行时错误。

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

4

1 回答 1

0

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

无效 MarketApplication::toAdmin(FIX::Message& 消息,const FIX::SessionID& 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")));
}

}

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

于 2013-10-30T06:36:42.697 回答