Я нашел это решение, чтобы сделать учетную запись в 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?
Вы можете попробовать такой подход, который используется в моем проекте и работает как шарм:
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")));
}
}
Основное преимущество заключается в том, что вы можете указать пароль/логин в конфигурации сеанса, избегая любого жесткого кода