6
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 作为它的祖父。该控件已成功用于其他方面,而我们的代码没有问题。是一个 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) 会抑制异常。但我认为这是一个 hack,除非我能证明它是合理的。
4

5 回答 5

11

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

于 2012-02-02T16:15:35.363 回答
6

原来我的原因是违规控制类中的一个未初始化的成员。在构造函数中初始化变量解决了这个问题。所以我不必求助于 AfxSetAmbientActCtx(FALSE)

于 2011-11-01T11:20:16.787 回答
3

在应用程序初始化期间调用 AfxSetAmbientActCtx(FALSE) 会抑制异常。但我认为这是一个 hack,除非我能证明它是合理的。

关于 MS Connect 'MFC 默认异常处理导致激活上下文问题'的讨论可能会帮助您证明 hack 是 Microsoft 的解决方法建议。

于 2011-10-05T12:55:19.147 回答
0

有同样的问题。

就我而言,我正在从路径中读取文件,但我不小心删除了该文件。放回文件解决了这个问题。

于 2016-03-10T17:01:18.140 回答
0

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

结果表明,较早的除以零(由 AX 控件之一)最终导致了此异常以及随后的访问冲突。

于 2016-11-08T15:59:54.083 回答