ASSERT(FromHandlePermanent(hWndNew) == NULL)

1367 단어 MFC
여러 번의 하위 클래스로 인해 Debug Assertion Failed가 발생합니다!wincore.cpp Line: 320
저자: jqka2시간: January 17, 2013 분류:
일반적인 MFC 프로그램 Release에서는 문제가 없습니다.사실 잠재적인 다른 문제가 존재할 수도 있다.오늘 메모리 유출 디버깅 때문에프로그램을 Debug 버전으로 컴파일한 다음 디버깅을 시작하면 실패를 단언합니다.
이번 오류는 MFC의 원본 파일 wincore에 있습니다.cpp의 320 줄입니다.
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

    if (hWndNew == NULL)
        return FALSE;

    CHandleMap* pMap = afxMapHWND(TRUE); // create map if not exist
    ASSERT(pMap != NULL);

    pMap->SetPermanent(m_hWnd = hWndNew, this);

#ifndef _AFX_NO_OCC_SUPPORT
    AttachControlSite(pMap);
#endif

    return TRUE;
}

320 줄 위치:
ASSERT(m_hWnd == NULL);

일반적인 대화상자 프로그램은 세 개의 대화상자를 동적으로 만듭니다.첫 번째 단계까지 디버깅하는 것은 문제없다.두 번째는 CXXDlg->Create(...)로 갑니다.그때 Asserting Failed에 보고해.
이번에는 두 번째 대화상자의 특수한 코드를 생각해야 한다.그래.내 자식은 CEdit를 하나 분류했다.
나는 CExtEdit 클래스를 썼다.CExtEdit m 변수를 ClassWizard로 바인딩했습니다.ctlExtEdit.끝났어. CXXDlg::OnInitDialog()에 m 를 넣었어.ctlExtEdit.SubClassDlgItem(...).이렇게 해서 mctlExtEdit의 중복 하위 클래스입니다.
해결 방법은 다음과 같습니다.
  • ClassWizard로 변수 바인딩 제거 mctlExtEdit - CExtEdit를 동적으로 생성합니다.
  • 여분을 제거하세요.SubClassDlgItem 함수

  • 태그: MFC, 디버깅

    좋은 웹페이지 즐겨찾기