В моем приложении для Windows я использую DLL-библиотеку c ++, обернутую DLL-библиотеками .NET (в частности, механизмом быстрого исправления).
Во время работы один раз в день (не в определенное время) в одном из конструкторов одного из встроенных классов выдается ошибка времени выполнения.
Несмотря на то, что ошибка обнаружена и сообщена (в файл журнала и в базу данных), я все равно получаю диалоговое окно «Ошибка времени выполнения» (в котором нет параметров восстановления / отладки) и после нажатия кнопки «ОК» (единственной доступно) мое приложение прекращено.
Это происходит при запуске в Debug, Release и даже в самом отладчике VS2005.
В качестве примечания я скомпилировал вышеупомянутые библиотеки DLL локально (поскольку хотя бы одна из них включает в себя автоматически сгенерированный код на основе спецификации XML).
Кто-нибудь? (подробности следуют)
Мой код:
try
{
QuickFix.Symbol Symbol = new QuickFix.Symbol();
report.get(Symbol);
PairsType instrument = ToPairType(Symbol.getValue());
if (PairsType.NONE == instrument)
return;
QuickFix.MDEntryDate entryDate = new MDEntryDate();
QuickFix.MDEntryTime entryTime = new MDEntryTime();
QuickFix.QuoteCondition quoteCondition = new QuoteCondition();
QuickFix.MDEntryPx MDEntryPxBid = new QuickFix.MDEntryPx();
QuickFix.MDEntryPx MDEntryPxAsk = new QuickFix.MDEntryPx();
QuickFix.NoMDEntries noMDEntries = new QuickFix.NoMDEntries();
report.get(noMDEntries);
for (uint i = 1; i <= noMDEntries.getValue(); ++i)
{
QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries group =
new QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries();
report.getGroup(i, group);
if (group.isSetQuoteCondition())
group.get(quoteCondition);
if (group.isSetMDEntryDate())
group.get(entryDate);
if (group.isSetMDEntryTime())
group.get(entryTime);
switch (group.getMDEntryType().getValue())
{
case MDEntryType.BID:
group.get(MDEntryPxBid);
break;
case MDEntryType.OFFER:
group.get(MDEntryPxAsk);
break;
}
}
// use data...
}
catch (Exception e)
{
// log the error
}
Сведения об ошибке:
Сообщение: внешний компонент выдал исключение
Трассировка стека:
at FIX.message_order.=(message_order* , message_order* )
at std._Tree_nod<std::_Tmap_traits<int,FIX::FieldBase,FIX::message_order,std::allocator<std::pair<int const ,FIX::FieldBase> >,1> >.{ctor}(_Tree_nod<std::_Tmap_traits<int\,FIX::FieldBase\,FIX::message_order\,std::allocator<std::pair<int const \,FIX::FieldBase> >\,1> >* , message_order* _Parg, allocator<std::pair<int const \,FIX::FieldBase> >* _Al)
at std._Tree<std::_Tmap_traits<int,FIX::FieldBase,FIX::message_order,std::allocator<std::pair<int const ,FIX::FieldBase> >,1> >.{ctor}(_Tree<std::_Tmap_traits<int\,FIX::FieldBase\,FIX::message_order\,std::allocator<std::pair<int const \,FIX::FieldBase> >\,1> >* , message_order* _Parg, allocator<std::pair<int const \,FIX::FieldBase> >* _Al)
at FIX.FieldMap.{ctor}(FieldMap* , Int32* order)
at QuickFix.Group..ctor(Int32 field, Int32 delim, Int32[] message_order)
at QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries..ctor()
at PriceProviders.PriceProvider.onMarketDataRefresh(FixSession session, MarketDataSnapshotFullRefresh report)