assert断言错误,到底是什么原因,谁能帮我看看

qianfu9068 2017-09-10 07:22:20
BOOL CWnd::Attach(HWND hWndNew)
{
ASSERT(m_hWnd == NULL); // only attach once, detach on destroy//出现在这一行
ASSERT(FromHandlePermanent(hWndNew) == NULL);//还有这一行也出现断言错误

// must not already be in permanent map

	// now hook into the AFX WndProc
WNDPROC* lplpfn = GetSuperWndProcAddr();
WNDPROC oldWndProc = (WNDPROC)::SetWindowLongPtr(hWnd, GWLP_WNDPROC,
(INT_PTR)AfxGetAfxWndProc());
ASSERT(oldWndProc != AfxGetAfxWndProc());//这一行也出现了

if (*lplpfn == NULL)
*lplpfn = oldWndProc;

	else if (*lplpfn != oldWndProc)
{
TRACE(traceAppMsg, 0, "Error: Trying to use SubclassWindow with incorrect CWnd\n");
TRACE(traceAppMsg, 0, "\tderived class.\n");
TRACE(traceAppMsg, 0, "\thWnd = $%08X (nIDC=$%08X) is not a %hs.\n", (UINT)(UINT_PTR)hWnd,
_AfxGetDlgCtrlID(hWnd), GetRuntimeClass()->m_lpszClassName);
ASSERT(FALSE);//还有这一行
// undo the subclassing if continuing after assert
::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (INT_PTR)oldWndProc);
}

给位麻烦给我分析分析原因
...全文
1163 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-09-12
  • 打赏
  • 举报
回复
调用堆栈 里 看 你的 代码, 上面都不是你的代码 !
zgl7903 2017-09-11
  • 打赏
  • 举报
回复
从断言来看, 应该是出现了两次 SubclassWindow 操作, 可能是两次 DDX_Control 关联了同一个控件
赵4老师 2017-09-11
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
worldy 2017-09-11
  • 打赏
  • 举报
回复
所谓断言,就是编程的时候,在逻辑上断定一定会发生的事情 比如,断言(正常人每天吃三餐),如果你吃了三餐,那就是正常的,否则,你就会饿肚子 ASSERT(m_hWnd == NULL),在函数执行前的时刻,断定,m_hWnd是空的,也就是你的窗口类还没有跟别的窗口关联,如果m_hWnd 不为空,意味着你的程序发生了错误
kuangbao9 2017-09-11
  • 打赏
  • 举报
回复
你Attach完之后要Detach,之后才能再Attach,对于同一个成员变量而言.

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧