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

C++ CreateEx导致未处理的异常正在停用的激活上下文不是最近激活的上下文,c++,exception,mfc,activation-context-api,C++,Exception,Mfc,Activation Context Api,这条线花了我两天的时间,没有解决办法。它的AnalysisDataTable是一个自定义windows控件,它的父级为CWnd。该控件已成功地用于其他方面,代码中没有任何问题。这是一个CPropertyPage 我遇到的问题是,这条线导致(而且每次都是这样)一个错误 MyProduct(x64)中0x76f7fd5c处未处理的异常。exe:0xC015000F:正在停用的激活上下文不是最近激活的上下文 异常也发生在32位中。我使用的是Windows7x64,VS2008 我已经尝试过的: 在调试

这条线花了我两天的时间,没有解决办法。它的AnalysisDataTable是一个自定义windows控件,它的父级为CWnd。该控件已成功地用于其他方面,代码中没有任何问题。这是一个CPropertyPage

我遇到的问题是,这条线导致(而且每次都是这样)一个错误
MyProduct(x64)中0x76f7fd5c处未处理的异常。exe:0xC015000F:正在停用的激活上下文不是最近激活的上下文

异常也发生在32位中。我使用的是Windows7x64,VS2008

我已经尝试过的:

  • 在调试器中启用win32异常中断。没有异常发生(除了第一次偶然的异常,我们的代码中有很多异常,并且没有任何影响)
  • 重新编译整个项目
  • 调试控件的OnCreate处理程序以查找异常
  • 调用堆栈:

    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 );
    
    意见:

  • 如果跳过WS_子标记,则不会发生异常,但也不会在控件上调用OnCreate
  • 如果忽略异常并继续,则应用程序可以正常工作,控件也可以正常工作
  • 在app init期间调用afxsetambientatctx(FALSE)会抑制异常。但我认为这是一种黑客行为,除非我能证明这是正当的
  • 在app init期间调用afxsetambientatctx(FALSE)会抑制 例外。但我认为这是一种黑客行为,除非我能证明这是正当的


    这可能有助于您证明该黑客行为是微软提出的一项变通建议。

    结果表明,我的攻击是由于违规控件类中的未初始化成员造成的。在构造函数中初始化变量修复了该问题。因此,我不必求助于afxsetambientatctx(FALSE)

    在解决了很多问题之后,我发现跟踪根本问题的简单方法是转到Debug->Exceptions并启用所有抛出的异常。然后,您会发现还有一些异常正在触发,被静默地捕获,但会弄乱激活上下文。一旦修复了第一个异常,激活上下文异常就不会发生。

    也有同样的问题


    在我的例子中,我从一个路径读取一个文件,我不小心删除了那个文件。把文件放回去解决了这个问题

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


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

    激活上下文被停用”症状通常是上游异常跨越激活上下文的级联症状。也许你第一次发现的例外之一就是这样做。查看是否可以捕获并处理“激活上下文”异常之前发生的第一次意外异常,该异常离引发异常的位置较近。调试+异常,勾选引发的框。
    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++