问题引起,是以前接手的两个控件,最近发现,在IE单进程下运行,同时多个页面运行,会崩溃。
如以往一样,查看指针是否为空,数组越界之类的,但是并未发现这种问题。
问题描述:
单进程IE,打开多个tab页,都调用my.ocx。会崩溃。
当打开的只有一个tab页时,运行正常。
当打开第二个tab页调用my.ocx时。就会崩溃。
如果多进程,每个tab一个进程,则不会崩溃。
ocx是文档视图结构。
崩溃是在myctrl中的oncreate()里面崩溃。
下面是oncreate里面的部分函数。
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
OnActivateInPlace(TRUE, NULL);//by mjh
AfxEnableControlContainer();
pDocTemplate = new CSingleDocTemplate(
IDR_MainTools,
RUNTIME_CLASS(CKCXZTDoc),
RUNTIME_CLASS(CMyPanel), // 主 SDI 框架窗口
RUNTIME_CLASS(CKCXZTView));
CDocument *pDoc = pDocTemplate->CreateNewDocument();
m_pFrame = pDocTemplate->CreateNewFrame(pDoc,NULL);
运行到m_pFrame = pDocTemplate->CreateNewFrame(pDoc,NULL);就会崩溃。
pDoc 和pDocTemplate都不是NULL。
问题解决:
问题在于CMyPanel类的oncreate里。
新建了三个什么都没有的doc、frame、view类,替换进去,程序不崩溃。
依次替换,发现在panel类的时候崩溃。
换个想法也很容易想通,pDocTemplate->CreateNewFrame(pDoc,NULL);这句崩溃。windowsAPI几乎是不会出错,两个指针也是正常的,而这句函数的作用是新建一个frame并返回frame指针,那也就是说,可能出错的就是new CSingleDocTemplate时加进去的那个frame类了。
总结:
这次崩溃问题解决,开阔了一些思路,或者说增加了一些经验。
当追踪到崩溃产生的地方是windowsAPI这种库函数,且调用到的指针都是正常的。
看似无法再追踪下去的时候,要考虑这个函数的作用,它会做什么处理,在这个“处理”中,是否和自己编写的代码有关,从而造成的问题。