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);
}
给位麻烦给我分析分析原因

解决方案 »

  1.   

    从断言来看, 应该是出现了两次 SubclassWindow  操作, 
    可能是两次 DDX_Control 关联了同一个控件
      

  2.   

    你Attach完之后要Detach,之后才能再Attach,对于同一个成员变量而言.
      

  3.   

    所谓断言,就是编程的时候,在逻辑上断定一定会发生的事情
    比如,断言(正常人每天吃三餐),如果你吃了三餐,那就是正常的,否则,你就会饿肚子ASSERT(m_hWnd == NULL),在函数执行前的时刻,断定,m_hWnd是空的,也就是你的窗口类还没有跟别的窗口关联,如果m_hWnd 不为空,意味着你的程序发生了错误
      

  4.   

    崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止