2013-01-22 6 views
0

VC2010 및 혼합 MFC/Win32를 사용하여 프레임 워크를 작성하고 있습니다. 각기 다른 윈도우 클래스를 등록하는 여러 컨트롤 유형이 있으며 그 중 일부는 표준 윈도우 클래스 중 하나 인 WindowProc을 사용합니다. 다음 예제와 유사합니다.기존 Windows 클래스를 새 이름으로 등록하는 것이 안전합니까?

void Button::OnInitClass(WNDCLASS &wndClass) 
{  
    Object::OnInitClass(wndClass); 
    if(!GetClassInfo(NULL, WC_BUTTON, &wndClass)) { 
     throw std::exception("Failed getting window class info."); 
    } 
    wndClass.lpszClassName = ButtonBase::GetWndClassName(); 
} 

bool Button::Create(CWnd* parent) 
{ 
    if(!WndClassInitialized) { 
     static VSCriticalSection cs; 
     cs.Enter(); 
     if(!WndClassInitialized) { 
      WNDCLASS wndClass; 
      memset(&wndClass, 0, sizeof(WNDCLASS)); 
      OnInitClass(wndClass); 
      assert(wndClass.lpszClassName); 
      if(!RegisterClass(&wndClass)) { 
       throw std::exception("Error registering window class"); 
      } 
      WndClassInitialized = true; 
     } 
     cs.Leave(); 
    } 

    DWORD style = WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHBUTTON | BS_MULTILINE; 
    DWORD exStyle = WS_EX_LEFT | WS_EX_LTRREADING;  
    Created = CWnd::CreateEx(exStyle, ButtonBase::GetWndClassName(), "", style , _attribAnchor.Rect, parent, 0) != FALSE;  
    SetFont(_font); 
    return Created; 
} 

모두 오랜 시간 동안 작동했지만 지금은 힙 손상이 발생합니다. 그러나 CreateEx 호출에서 WC_BUTTON 클래스를 직접 사용하면 힙 손상이 발생하지 않습니다.

WC_BUTTON에서 WindowProc을 사용하는 창 클래스를 등록하는 방법이 안전한지 의심 스럽습니다. 그것은 무엇입니까?

안전하다면 다른 곳의 힙 손상 경로를 찾아야합니다. 그러나 그렇지 않다면, 내가하려고하는 것을 안전하게하는 방법이 있습니까? (즉, 기존 클래스를 새 이름으로 등록합니다. 임의의 창 핸들을 사용하여 주어진 창 클래스 이름에서 컨트롤을 인식 할 수 있습니다.)

힙 손상은 문자열 할당 및 모든 매개 변수가 옳은 것처럼 보입니다. 문제는 그 이전의 어딘가에 있어야합니다. 사전에

감사합니다, 마틴

답변

0

내가 MFC/Win32에서이 악화 혼합 두려워. 메인 프레임 워크/SDK가 MFC 인 경우 MFC의 규칙과 스타일을 따르지 않는 이유는 무엇입니까? 왜 사용 :: RegisterClass 대신 AfxRegisterClass (훨씬 간단). 단순한 UI 컨트롤을 위해 모든 다른 클래스를 등록해야하는 이유는 무엇입니까?

일반적인 MFC 프로그램은 팝업 또는 최상위 창 (AfxRegisterClass 기준)의 새 창 클래스 만 등록합니다. MFC CWnd는 그 목적을 위해 기본 WndProc를 제공합니다. 커스텀 디자인 버튼 컨트롤을 원한다면 윈도우 서브 클래 싱 메커니즘을 사용할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. AfxRegisterClass를 사용하기 시작했습니다. :: RegisterClass로 변경하는 것은 단지 내 문제를 해결하기위한 많은 절망적 인 시도 중 하나였습니다. 두 가지 이유로 클래스를 등록해야합니다. 클래스 플래그 중 일부를 변경하고, 윈도우가 제 컨트롤 중 하나이고 어떤 것이 더 적합한지를 모두 인식 할 수 있기를 바랍니다. MFC를 사용하고 있기 때문에 서브 클래 싱 메커니즘을 사용하는 것이 더 정확한 해결책이라고 생각합니다. 단지 매우 성가신 것 같습니다. – Martin

+0

Btw, 내가 MFC를 사용하는 이유는 내가 VC6, MFC 및 ActiveX 용으로 작성된 오래된 대형 시스템을 대화하고 있다는 것입니다.하지만 MFC 부분도 없애고 ActiveX 부분을 제거하고 있습니다. 이 시점에서 전체 프로젝트를 다시 작성하는 것과 거의 같을 것입니다. – Martin