CreateEx导致未处理的异常被停用的激活上下文不是最近激活的激活上下文

Ali*_*Ali 6 c++ mfc exception activation-context-api

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 );
Run Code Online (Sandbox Code Playgroud)

这条线花了我两天的努力,没有解决方案.itsAnalysisDataTable是一个自定义窗口控件,CWnd作为其盛大的盛大父级.该控件已成功用于其他步骤,而我们的代码中没有任何问题.是一个CPropertyPage.

我遇到的问题是行原因(并且每次都会这样做)MyProduct(x64)中的0x76f7fd5c处的未处理异常.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++
Run Code Online (Sandbox Code Playgroud)

观察:

  1. 如果我跳过WS_CHILD标志,则不会发生异常,但也不会在控件上调用OnCreate!
  2. 如果我忽略异常并继续,应用程序工作正常,控件也可以正常工作.
  3. 在app init期间调用AfxSetAmbientActCtx(FALSE)会抑制异常.但我认为这是一个黑客攻击,除非我能证明这一点.

Dou*_*ugN 11

在遇到很多这些之后,我发现追踪根问题的简单方法是转到Debug - > Exceptions并启用所有Thrown异常.然后你会发现有一些其他异常正在触发,被静默捕获,但是搞乱了激活上下文.修复第一个异常后,将不会发生激活上下文异常.


Ali*_*Ali 6

事实证明我的是由于违规控制类中的未初始化成员.在构造函数中初始化变量修复了问题.所以我不必诉诸于AfxSetAmbientActCtx(FALSE)