CreateEx вызывает необработанное исключение отключаемый контекст активации не является самым последним активированным

itsAnalysisDataTable.CreateEx( WS_EX_CLIENTEDGE, AfxRegisterWndClass( CS_DBLCLKS, LoadCursor( NULL, IDC_ARROW ), (HBRUSH)::GetStockObject( NULL_BRUSH ), NULL ), "AnalysiysTable", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, dialogItemRect, this, IDC_ANALYSIS_DATA_TABLE );

эта линия стоила мне двух дней усилий, без решения. itsAnalysisDataTable-это пользовательский элемент управления windows, имеющий CWnd в качестве его Grand grand grand parent. Элемент управления успешно использовался в других шагах без проблем в нашем коде. этой является CPropertyPage.

проблема, которую я имею, - это причина линии (и она делает это каждый раз) Необработанное исключение в 0x76f7fd5c в MyProduct (x64).exe: 0xC015000F: контекст активации деактивируется не самый последний активированный.

исключение также происходит в 32-битном. Я нахожусь в Windows 7 x64, против 2008.

что я уже пробовал:

  1. включение break для исключений win32 в отладчике. Никаких исключений не происходит (кроме исключений первого шанса, которых в нашем коде много и которые не имеют эффекта)
  2. перекомпиляция всего проекта
  3. отладка обработчика onCreate для управления исключения.

Стек Вызовов:

ntdll.dll!0000000076f7fd5c()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
kernel32.dll!0000000076df42d3()     
mfc90d.dll!AfxDeactivateActCtx(unsigned long dwFlags=0, unsigned __int64 ulCookie=2077018657900210161)  Line 260 + 0x19 bytes   C++

замечания:

  1. если я пропущу флаг WS_CHILD, исключение не произойдет, но OnCreate также не вызывается на элементе управления!
  2. если я игнорирую исключение и продолжаю, приложение работает нормально, элемент управления также работает нормально.
  3. вызов AfxSetAmbientActCtx (FALSE) во время инициализации приложения подавляет исключение. Но я думаю, что это хак, Если я не могу оправдать он.

5 ответов


после нажатия многих из них я нашел простой способ отследить корневую проблему, чтобы перейти к Debug - > Exceptions и включить все брошенные исключения. Затем вы обнаружите, что есть какое-то другое исключение, которое срабатывает, молча ловится, но портит контекст активации. Как только вы исправите первое исключение, исключение контекста активации не произойдет.


оказывается, мой был из-за неинициализированного члена в оскорбительном классе управления. Инициализация переменной в конструкторе исправила проблему. Поэтому мне не пришлось прибегать к AfxSetAmbientActCtx (FALSE)


вызов AfxSetAmbientActCtx (FALSE) во время инициализации приложения подавляет исключение. Но я думаю, что это хак, Если я не могу это оправдать.

на обсуждение MS Connect "обработка исключений по умолчанию MFC вызывает проблемы с контекстом активации" может помочь вам оправдать взлом, являющийся обходным решением от Microsoft.


была та же проблема.

в моем случае я читал файл из Пути, и я случайно удалил этот файл. Возвращение файла решило проблему.


были некоторые таинственные сбои в программе, которая размещала IE вместе с несколькими элементами управления ActiveX.

оказывается, более раннее деление на ноль (одним из элементов управления AX) в конечном итоге вызвало это исключение и последующее нарушение доступа.