我找到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使用用户名和密码登录?
答案 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")));
}
}
主要优点是您可以在会话配置中指定密码/登录,避免任何硬编码