항상 잊을만 하면 쓸 필요가 생기는 코드.

내부적으로 trace 를 구현할 때 참 유용하다.
특히 MFC 의 TRACE 는 유니코드 문자열을 지원하지 못하기 때문에 MFC 로 유니코드 어플리케이션을 만들때 急 필요한 코드 조각이다.

기왕이면 아래 1024 바이트를 스택에 만드는 것보다 스레드 별로 TLS 를 만드는 편이 더 낫겠다는 생각이 글 쓰면서 들었다 -_-

// 1. 일반적인 코딩
void _DBGTRACE(TCHAR* format, ...)
{
       TCHAR buf[1024];
       va_list        marker;
       va_start(marker, format);
       _vstprintf(buf, format, marker);
       va_end(marker);

       OutputDebugString(buf);
}

// 2. 안전+LFH힙을 이용한 문자열 포맷팅
 LPCTSTR HFormat(LPCTSTR format, ...)
 {
  va_list        marker;
  va_start(marker, format);

  int len = _vsctprintf( format, marker ) + 1;
  LPTSTR buf = (LPTSTR)Alloc(len);
  _vstprintf_s(buf, len, format, marker);

  va_end(marker);

  return buf;
 }

문자열의 경우 LFH(Low Fragment Heap) 을 사용하면 이득을 볼 수 있기 때문에 Alloc 에 해당하는 함수에서 적절히(?) 처리해주고.. _s 계열 함수를 이용해 버퍼 오버런에 대응할 수 있도록 한다..

Posted by 김모작자
TAG ,

댓글을 달아 주세요

  1. 해보리 2009.02.17 19:53  댓글주소  수정/삭제  댓글쓰기

    vsprintf()에서 char 형변환 때문에 문제가 생기지 않았는지 궁금하네요...
    유니코드로 하면 함수 자체는 char*를 받아가는 거라... 오류가 발생할텐데요...