Notepad2 삽질 이야기

@codemaru · October 27, 2007 · 5 min read

재즈벌레님께서 완전히 한글화하신 버전을 아래 링크에서 다운받으실 수 있습니다.
http://jazzbug.tistory.com/130

Notepad2        md 0

어제 올렸던 노트패드에 툴바가 표시된지 않는 문제가 있었습니다. 노트패드 소스는 제가 수정을 전혀 안했던터라 -- Scintilla 라이브러리 코드만 변경했죠 -- 원인이 뭘까 고민을 잠깐 해봤습니다. 그러다 문득 저렇게 이뿌게 표시되야할 프로그램이 투박하게 표시되는 것에서 매니페스트(manifest) 설정이 잘못되었음을 눈치챘습니다. 하나는 금방 찾은 셈이었습니다. 프로젝트 설정에서 매니페스트를 포함해서 링크하도록 고치고 원래있던 매니페스트 리소스를 제거했습니다. 이젠 되겠지 했는데 여전히 툴바는 표시되지 않았습니다. 그래서 디버깅을 했습니다.

SendMessage(hwndReBar,RB\_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand);

위 부분에서 문제가 있음을 찾을 수 있었습니다. 위 결과가 0이면 실패한 것인데 계속 0을 리턴하더군요. 답답한 것은 GetLastError도 없다는 겁니다. 단지 실패한 거죠. 이런 경우에는 보통 rbBand 구조체를 잘못 설정한 경우가 많습니다. 그래서 위쪽에 rbBand를 설정하는 부분을 꼼꼼히 살펴봤습니다. 이상하게 없더군요. 그래서 WTL의 밴드 삽입 코드를 복사해서 그 놈을 호출하도록 변경했습니다. 그래도 여전히 실패합니다. 구조체를 모두 다 채워요 여전히 툴바는 표시되지 않았습니다.

이쯤되면 막장이죠. ㅠㅠ 가장 최고의 방법은 되는 것과 비교하는 거죠. 어제 정수님께서 올려주신 버전을 OllyDbg로 꺼냈습니다. 리바 메시지 핸들러에 RB_INSERTBAND가 오는 경우에 브포가 걸리도록 설정하고 스택을 뒤졌습니다. 넘어온 구조체는 다음과 같더군요.

Notepad2        md 1

50이라고 선택된 곳 부터가 구조체 시작 지점입니다. RBBANDINFO의 첫 번째 필드는 cbSize로 구조체 크기입니다. 0x50바이트라는 거죠. 이번에는 제가 어제 컴파일한 바이너리를 넣고 확인했습니다. 저기에 0x64가 들어있습니다. 이제 먼가 잘못됐다는 것을 알았죠. 구조체 정의 부분으로 갔습니다.

typedef struct tagREBARBANDINFOA  
{  
    UINT        cbSize;  
    UINT        fMask;  
    UINT        fStyle;  
    COLORREF    clrFore;  
    COLORREF    clrBack;  
    LPSTR       lpText;  
    UINT        cch;  
    int         iImage;  
    HWND        hwndChild;  
    UINT        cxMinChild;  
    UINT        cyMinChild;  
    UINT        cx;  
    HBITMAP     hbmBack;  
    UINT        wID;  
#if (\_WIN32\_IE >= 0x0400)  
    UINT        cyChild;  
    UINT        cyMaxChild;  
    UINT        cyIntegral;  
    UINT        cxIdeal;  
    LPARAM      lParam;  
    UINT        cxHeader;  
#endif  
#if (\_WIN32\_WINNT >= 0x0600)  
    RECT        rcChevronLocation;  // the rect is in client co-ord wrt hwndChild  
    UINT        uChevronState;      // STATE\_SYSTEM\_\*  
#endif  
}   REBARBANDINFOA, \*LPREBARBANDINFOA;

제가 사용하는 SDK는 비스타용으로 최신 버전입니다. 0x600이상이면 이라고 정의하는 부분이 보이시죠. 그 만큼이 추가된 20바이트 였습니다. Notepad2 프로젝트에서 _WIN32_WINNT를 정의하지 않아서 자동으로 0x600으로 정의됐고, 그로인해 구조체 크기가 달라졌던 겁니다. 당연히 XP에서는 동작할리 없겠죠.

간만에 제대로 말렸네요. ㅋㅋㅋ
아래 파일은 수정된 버전입니다.

notepad2.zip

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중