Причины CreateEx Необработанное исключение Деактивируемый контекст активации не является последним активированным - PullRequest
6 голосов
/ 05 октября 2011
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 в качестве своего великого великого прародителя.Элемент управления успешно использовался в других условиях без проблем в нашем коде. this является CPropertyPage.

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

Исключение также имеет место в 32-битном режиме.Я на Windows 7 x64, VS 2008.

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

  1. Включение прерывания на исключениях 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 также не вызывается дляcontrol!
  2. Если я игнорирую исключение и продолжаю, приложение работает нормально, элемент управления также работает нормально.
  3. Вызов AfxSetAmbientActCtx (FALSE) во время инициализации приложения исключает исключение.Но я думаю, что это взлом, если я не смогу оправдать это.

Ответы [ 5 ]

11 голосов
/ 02 февраля 2012

После многих из них я обнаружил, что простой способ отследить корневую проблему - перейти в Debug -> Exceptions и включить ALL Thrown исключения. Тогда вы обнаружите, что есть еще одно исключение, которое срабатывает, молча ловится, НО портит контекст активации. Как только вы исправите первое исключение, исключение контекста активации не произойдет.

6 голосов
/ 01 ноября 2011

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

3 голосов
/ 05 октября 2011

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

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

0 голосов
/ 08 ноября 2016

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

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

0 голосов
/ 10 марта 2016

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

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

...