quickfix bad_cast исключение с взломанным login_message

0

Я нашел это решение, чтобы сделать учетную запись в QuickFIX через C++ с именем пользователя и паролем.

Работая с 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?

Теги:
login
quickfix

1 ответ

0

Вы можете попробовать такой подход, который используется в моем проекте и работает как шарм:

void MarketApplication :: toAdmin (FIX :: Message & 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")));
}

}

Основное преимущество заключается в том, что вы можете указать пароль/логин в конфигурации сеанса, избегая любого жесткого кода

  • 0
    FIX :: SessionSettings :: m_settings

Ещё вопросы

Сообщество Overcoder
Наверх
Меню