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을 사용하는 창 클래스를 등록하는 방법이 안전한지 의심 스럽습니다. 그것은 무엇입니까?
안전하다면 다른 곳의 힙 손상 경로를 찾아야합니다. 그러나 그렇지 않다면, 내가하려고하는 것을 안전하게하는 방법이 있습니까? (즉, 기존 클래스를 새 이름으로 등록합니다. 임의의 창 핸들을 사용하여 주어진 창 클래스 이름에서 컨트롤을 인식 할 수 있습니다.)
힙 손상은 문자열 할당 및 모든 매개 변수가 옳은 것처럼 보입니다. 문제는 그 이전의 어딘가에 있어야합니다. 사전에
감사합니다, 마틴
답장을 보내 주셔서 감사합니다. AfxRegisterClass를 사용하기 시작했습니다. :: RegisterClass로 변경하는 것은 단지 내 문제를 해결하기위한 많은 절망적 인 시도 중 하나였습니다. 두 가지 이유로 클래스를 등록해야합니다. 클래스 플래그 중 일부를 변경하고, 윈도우가 제 컨트롤 중 하나이고 어떤 것이 더 적합한지를 모두 인식 할 수 있기를 바랍니다. MFC를 사용하고 있기 때문에 서브 클래 싱 메커니즘을 사용하는 것이 더 정확한 해결책이라고 생각합니다. 단지 매우 성가신 것 같습니다. – Martin
Btw, 내가 MFC를 사용하는 이유는 내가 VC6, MFC 및 ActiveX 용으로 작성된 오래된 대형 시스템을 대화하고 있다는 것입니다.하지만 MFC 부분도 없애고 ActiveX 부분을 제거하고 있습니다. 이 시점에서 전체 프로젝트를 다시 작성하는 것과 거의 같을 것입니다. – Martin