마이크로 소프트의 미숙한 설계 하나..

윈도우 MFC 클래스 중..
에디트류(CEditCtrl, CEditView 등)의 클래스 멤버함수들 중에..
다음과 같은 설계상의 미스로 생각되어지는 문제아들이 있습니다..

// =====================================================
    OnkeyDown(UINT nChar, UINT nRepCnt, UINT nFlags),

    OnChar(UINT nChar, UINT nRepCnt, UINT nFlags),

    OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
// =====================================================

예전에 이들 함수를 사용하면서 해맸던 경험이 있었는데..
해맸던 원인은 바로..
이들 함수의 인자 명칭에 있었습니다..

nChar  값에 문제가 있는데..
OnKeyDown(..) 이나 OnKeyUp(..) 에선 가상 키 코드값이 넘어오고,
OnChar(..) 에선 아스키 코드 값이 넘어옵니다..

넘어오는 인자의 형이나 이름이 같으니 개발자 입장에서는 당연히..
넘어오는 인자의 정보가 같다는 직감을 가지고 개발에 임하게 되고,
여기서 혼란을 야기할 소지가 발생하는 거지요..

물론,
MSDN 을 꼼꼼히 읽어본다면 쉽게 해결할 수 있는 문제이지만..
성격이 급하다거나,
주변 환경이 산만해서 독해에 집중하기 힘들때..
(아니면 영어에 쥐약..;;)

이런 경우엔,
별거 아닌곳에서 디버깅하는데 시간을 낭비할 소지가 있게 됩니다..
(제가 위와 같은 경험을 겪었습니다..)

어플리케이션의 사용성에서 직감대로 동작하는게 중요하듯,
개발시에도 라이브러리 설계자는 개발자의 직감대로
동작하게끔 라이브리러를 만들어야 할 책임이 있습니다..

PS. 적어도 마소 정도의 회사라면..


by 200360 | 2006/09/07 00:07 | 버그 보고 | 트랙백 | 덧글(1)

PostMessage() 의 이해부족으로 생긴 버그 하나..

SendMessage()와 PostMessage() 함수의
이해 부족으로 겪었던 이야기입니다..

// ============================================================================
void BugMessage()
{
    char caMsg[10] = "...";
   
    // 다른 모듈에 메시지 전달
    m_pOtherModule->PostMessage(WM_USERMSG, (WPARAM)caMsg, 0);
}
// ============================================================================

위의 코드를 컴파일하면..
오류나 경고가 발생하진 않을 것입니다..
하지만, 런타임 오류가 발생할 확률이 매우 큰 코드입니다..

PostMessage() 의 경우,
전달하고자 하는 메시지를 메시지 큐에 삽입한 후에
곧바로 리턴하게 됩니다..

만약,
m_pOtherModule 에 해당하는 모듈에서 전달받은 메시지를 처리하기 전에
BugMessage() 함수가 종료되어 버리면
포인터 caMsg가 먼저 파괴되어 버리게 될 것입니다..

m_pOtherModule 이 가리키는 모듈은
전달받은 인자에 접근을 시도할 것이고,
결국 악마와 같은 런타임 오류가 발생하게 됩니다..

이런 문제를 해결할 수 있는 방법은
PostMessage() 대신에 SendMessage()를 호출하는 것입니다..

SendMessage()는 메시지 큐를 경유하지 않고 해당 메시지의
핸들러 함수를 호출하며, 이 핸들러 함수가 반환을 한 후에
SendMessage() 함수도 반환하게끔 동작합니다..


PS. 인자를 '값에 의한 복사' 방식으로 전달하면
      런타임 오류가 발생하지 않겠죠..!!


by 200360 | 2006/08/27 23:14 | 버그 보고 | 트랙백 | 덧글(3)

◀ 이전 페이지          다음 페이지 ▶