可以跟踪到 mfc提供的源代码内部,(注:如果打开了mfc源代码,设置了断点,但是跟不进去,那就需要更新PDB文件,具体网上搜)
打开 wincore.cpp文件(D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc)。查看 312 行,所在函数如下:
CWnd* PASCAL CWnd::FromHandle(HWND hWnd)
{
CHandleMap* pMap = afxMapHWND(TRUE); //create map if not exist
ASSERT(pMap != NULL);
CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);
#ifndef _AFX_NO_OCC_SUPPORT
pWnd->AttachControlSite(pMap);
#endif
ASSERT(pWnd == NULL || pWnd->m_hWnd == hWnd);
return pWnd;
}
断言就是 Assert( pWnd == NULL || pWnd->m_hwnd == hWnd );也就是读取句柄映射表错误,有2种可能:
1你传入的窗口句柄为空,也就是生成了窗口对象但是没有使用 Create创建窗口。
2.窗口所在线程不是当前所在线程,那么使用FromHandle读取映射窗口指针或者映射临时窗口指针必然会出错。窗口都是线程相关的噢
你点击菜单命令出错,你就有可能你的菜单命令执行的代码有 FromHandle语句,你看看,一定就是它
200分啊,还有不明白的问我吧,一定要把分给我
在你 这个菜单的响应函数处应该有一个 ASSERT断言宏,你可以设断点跟踪一下,找到这个点就好办得多了,有的时候是一个函数内部调用了这个宏
我猜你的错误是因为你什么句柄创建错误,好好看看相关部分应该能找到,要么把菜单相应函数贴出来
代码贴出来,才好帮你分析,这种情况一般是代码的逻辑错误,Debug Assertion Failed!是因为,vc在debug版的代码中插入了很多帮助调试的代码,包括检查esp等,就是在函数调用的前后检查esp是否相同,不同的话,就debug assertion failed咯。
菜单的响应函数没有写好.语法出错了.你把菜单的响应函数发上来看看.
装个vs,它会自动调试进入出现问题的断点,你会很清楚的看到是那根指针出了问题,一般情况下,是某个窗口句柄申请资源不成功,而我们却接着用这个句柄来进行其他操作引起的,控制一下就没事了。
可以用简单的if语句控制,如果申请资源不成功,那么。。。。(加上你的处理)