程序用VC6编写,已经顺利跑过的操作系统有
(1)台式机:2000 SERVER
(2) 笔记本:XP HOME
(3) 台式机: XP Profession SP2(4)但是在一台笔记本:操作系统为XP Profession SP2与(3)中的操作系统一样,退出是总是报错跟踪查原因,报错是在WICORE.CPP文件的:BOOL CWnd::DestroyWindow()函数中,报错地点如下
if (pWnd != NULL)
{
// Should have been detached by OnNcDestroy
#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);//报错地点
#endif
}(5)对比两台机器的流程:没有报错的前一个步骤是CDocument::OnCloseDocument()
报错的前一个步骤是,CBUTTON::~CButton(6)报错的电脑装过VS 2005想问一下:
(1)VS 2005与VC6.0会产生冲突吗?如果有冲突,会产生哪些文件冲突??
(2)改什么设置会影响正常的MFC框架析构流程??
(3)pMap->LookupPermanent(hWndOrig) == NULL);这一句话有什么作用,如果不执行这一句话,会产生什么后果??
(1)台式机:2000 SERVER
(2) 笔记本:XP HOME
(3) 台式机: XP Profession SP2(4)但是在一台笔记本:操作系统为XP Profession SP2与(3)中的操作系统一样,退出是总是报错跟踪查原因,报错是在WICORE.CPP文件的:BOOL CWnd::DestroyWindow()函数中,报错地点如下
if (pWnd != NULL)
{
// Should have been detached by OnNcDestroy
#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);//报错地点
#endif
}(5)对比两台机器的流程:没有报错的前一个步骤是CDocument::OnCloseDocument()
报错的前一个步骤是,CBUTTON::~CButton(6)报错的电脑装过VS 2005想问一下:
(1)VS 2005与VC6.0会产生冲突吗?如果有冲突,会产生哪些文件冲突??
(2)改什么设置会影响正常的MFC框架析构流程??
(3)pMap->LookupPermanent(hWndOrig) == NULL);这一句话有什么作用,如果不执行这一句话,会产生什么后果??
?看来是内存被破坏或者是因为在多线程里使用窗口类造成的.
to mynamelj(隐姓埋名,从此绝迹在互联网之上) :试了,还是搞不定。
TO DentistryDoctor(不在无聊中无奈,就在沉默中变态) :我的BUTTON类用的是CButtonST,我估计跟此有点关系!但我始终不明白:为什么用相同的开发工具编译出来的程序,退出时程序所走的流程不一样,实在是非常非常非常的郁闷!!
2.对于所有的字符串拷贝操作详细检查;
3.检查memset,memcpy操作是否越界;
我觉得你的程序可能在进行上述操作的时候,破坏了 pWnd 指针。99%的可能是你自己程序的问题,先不要怀疑微软的东西这么脆弱。
检查new和delete是否在同一个线程.
在内存释放后置指针为NULL
m_hWnd = NULL;
试一下应该就没问题了。再看一下你这些按钮所在的对话框是否声明成全局的了,如果是,并且可以的话,把它改成局部的,比如
以前是头文件里CLogin m_dlg;实现时m_dlg.DoModal()
现在则改为直接在实现时 CLogin dlg; dlg.DoModal()机器环境不同,应用程序用到的库不同等原因都会导致全局的窗口在DoModal返回时没有合理释放或销毁一些控件,而局部的就会释放的很干净。Good luck~~
总之在析构时句柄一定为NULL,否则肯定就有问题。
事实就是真理,试试就知道咯:)我后来说的那个方法一定没有任何问题。