程序用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.   

    try put the mfc42.dll into the directory of exe, then run i.
      

  2.   

    ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);//报错地点
    ?看来是内存被破坏或者是因为在多线程里使用窗口类造成的.
      

  3.   

    将工程改为static library试试,不要使用shared dll
      

  4.   

    to krh2001(边城浪子) 方法试了,搞不定
    to mynamelj(隐姓埋名,从此绝迹在互联网之上) :试了,还是搞不定。
    TO DentistryDoctor(不在无聊中无奈,就在沉默中变态) :我的BUTTON类用的是CButtonST,我估计跟此有点关系!但我始终不明白:为什么用相同的开发工具编译出来的程序,退出时程序所走的流程不一样,实在是非常非常非常的郁闷!!
      

  5.   

    1.所有的变量必须初始化;
    2.对于所有的字符串拷贝操作详细检查;
    3.检查memset,memcpy操作是否越界;
    我觉得你的程序可能在进行上述操作的时候,破坏了 pWnd 指针。99%的可能是你自己程序的问题,先不要怀疑微软的东西这么脆弱。
      

  6.   

    这个错误出现的很多啊,msdn上也有关于此的论述
      

  7.   

    如果你的CBUTTON是new的,
    检查new和delete是否在同一个线程.
      

  8.   

    指针使用上的问题。。在构造函数中置指针为NULL,
    在内存释放后置指针为NULL
      

  9.   

    #ifdef _DEBUG,用的debug调试版本?
      

  10.   

    to rageliu(长白山的水怪居然是假的 近期目标是还债!!!等有钱了去) ( ) :用的是DEBUG版本,RELEASE版本没有这个问题,但是我希望找出问题的原因
      

  11.   

    TO lixiaosan(小三) ( ) : 大多数情况下我都这样做了~,能不能更详细点啊??
      

  12.   

    先教你个绝招,假设你的按钮是CButtonST,那么就在CButtonST的析构函数里加一句话:
    m_hWnd = NULL;
    试一下应该就没问题了。再看一下你这些按钮所在的对话框是否声明成全局的了,如果是,并且可以的话,把它改成局部的,比如
    以前是头文件里CLogin m_dlg;实现时m_dlg.DoModal()
    现在则改为直接在实现时 CLogin dlg; dlg.DoModal()机器环境不同,应用程序用到的库不同等原因都会导致全局的窗口在DoModal返回时没有合理释放或销毁一些控件,而局部的就会释放的很干净。Good luck~~
      

  13.   

    TO littlepboy(vc小p孩) ( ) : 按照你的方法,的确不出问题了,谢谢现了,但是不知道这样会不会出现什么新的隐患^_^
      

  14.   

    是不是它该干的都干了,就m_hWnd = NULL这一句没干我就不敢保证了:)
    总之在析构时句柄一定为NULL,否则肯定就有问题。
    事实就是真理,试试就知道咯:)我后来说的那个方法一定没有任何问题。
      

  15.   

    m_hWnd = NULL前判断下,该释放的释放应该就没问题了
      

  16.   

    m_hWnd = NULL前判断下,该释放一下