“正被停用的激活上下文不是最近激活的”的错误的解决
作者:朱金灿
来源:http://blog.csdn.net/clever101
前几天同事叫我帮忙看一个问题,问题是这样的:MFC程序中创建了一个停靠栏窗口之后窗口跟视图窗口贴在一块是透明的,然后程序退出时崩溃。经过查看堆栈,发现错误信息是:正被停用的激活上下文不是最近激活的
开始我对这个错误有点百思不得其解,通过查看他的代码,发现了问题所在:原来他在CMainFrame类的OnCreate函数里使用停靠栏类的局部变量创建停靠栏窗口。这样做有什么问题呢?大家知道,MFC的窗口类都是支持动态创建的,而MFC的动态创建机制的一步是将窗口类信息(如名字)之类保存在一个全局链表里(具体请见《深入浅出MFC》)。而使用窗口类的局部变量创建窗口意味着一处这个函数这个变量就析构了,而窗口类信息(如名字)之类还保存在全局链表里。当这个链表最后析构时发现窗口已经无效了,自然崩溃了。明白了这点,我叫同事将停靠栏类的局部变量改为CMainFrame类的数据成员,这样确保它是全局的有效对象。由此可以得知,支持MFC的动态创建的对象都必须是全局有效的对象,否则在程序退出时必然崩溃。