被去激活的激活上下文不是最近激活的激活上下文


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 );

这个问题花了我两天的时间,还是没有解决。它的analysisdatatable是一个自定义窗口控件,CWnd是它的祖辈。该控件已在其他地方成功使用,代码中没有出现问题。这个是一个CPropertyPage。

我遇到的问题是这行导致(它每次都这样)在MyProduct (x64).exe中的0x76f7fd5c未处理的异常: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也不会在控件上调用!
  2. 如果我忽略异常并继续,应用程序工作正常,控件也工作正常。
  3. 在应用程序初始化期间调用AfxSetAmbientActCtx(FALSE)会抑制异常。但我认为这是一个黑客,除非我能证明它。

在击中很多这些之后,我发现追踪根本问题的简单方法是去调试->异常并启用所有抛出的异常。然后你会发现有一些其他异常正在触发,被静默捕获,但搞乱了激活上下文。一旦修复了第一个异常,激活上下文异常就不会发生了。

原来是由于违规控件类中未初始化的成员。在构造函数中初始化变量解决了这个问题。所以我不需要使用AfxSetAmbientActCtx(FALSE)

在应用程序初始化期间调用AfxSetAmbientActCtx(FALSE)会抑制例外。但我认为这是一个黑客,除非我能证明它。

关于MS Connect 'MFC默认异常处理导致激活上下文问题'的讨论可能有助于您证明黑客是微软的变通建议。

有同样的问题

在我的情况下,我是从一个路径读取文件,我不小心删除了该文件。把文件放回去解决了问题。

在一个托管IE和几个ActiveX控件的程序中出现了一些神秘的崩溃。

结果是先前的除零(由一个AX控件)最终导致了此异常和随后的访问冲突。

最新更新