2010년 5월 31일 월요일

_CtrlsValidHeapPointer(pUserData) Debug Assertion 해결법

대부분의 경우 메모리 문제때문에 생긴다. 메모리 할당과 해제에 문제가 없는지 확인한다.
다른 문제가 없다면 debug와 release용 DLL 혹은 LIB를 섞어쓴 것을 의심해야 한다. 특히 VS2008은 debug와 release를 명확히 구분하므로 섞어쓴 경우  _CtrlsValidHeapPointer(pUserData) debug assertion을 표시한다.

2010년 5월 30일 일요일

다국어 지원 위해 반드시 Unicode 사용

VS2008을 쓰니 이제 개발도 유니코드(Unicode)로 해야겠다. Unicode(wide character: wchar_t) 체계에서는 모든 문자(영어 혹은 한글)는 2 bytes라는 것만 기억하면 되겠다.

[유니코드 선언과 사용]
1. 문자변수 선언: TCHAR

2. 문자열변수 선언: LPCTSTR, LPTSTR, TCHAR *

3. 문자열 정의: _T("...")

4. 문자열 함수: _tcs...()
   - _tcslen: 문자열의 요소갯수를 반환. ANSI인지 Unicode인지 구별하지 않고 사용한 문자열의 요소갯수(byte수가 아님)를 알려줌.
   - 요수갯수는 문자열을 구성하는 요소들(char, TCHAR, or wchar_t)이 몇 개인가이고 byte수는 문자열이 차지하는 실제 메모리 공간의 수를 뜻함.
   - sizeof(TCHAR):  문자의 byte수를 알려줌. ANSI이면 1 byte, Unicode이면 2 bytes.
   - strlen: 문자열의 byte수를 반환함.

5. MBCS(Multi-Byte Character Set)와 Unicode의 변환
   - MBCS to Unicode: mbstowcs(...) or MultiByteToWideChar(...)
   - Unicode to MBCS: wcstombs(...) or WideCharToMultiByte(...)
   - USES_CONVERSION 선언후 A2W(...) or W2A(...) 사용

[유니코드 함수]
1. 유니코드를 지원하지 않는 함수: 이 함수 입력은 반드시 ASCII가 되어야 함, _T("...")로 정의하면 안 됨
   - GetProcAddress()

[참고문헌]

VS2008은 Class Wizard가 없구나.

예전 VS2003부터 없어졌단다. VS2008에서 class wizard없이 message map을 다루는 방법은 첨부링크에 있다. 쉽게 말하면, message map을 연결하기 원하는 클래스로 가서 마우스의 오른쪽을 클릭한 후 "속성" 항목을 누른다. 그러면 "속성창"이 떠서 이 창에 입력하면 된다. "속성창"은 항목별로 구분되어 있다.
  • "속성창 -> 속성"은 클래스 속성 자체를 변경할 수 있다.
  • "속성창 -> 메시지"에는 해당 클래스에 Windows message map을 연결할 수 있는 기능이 있다.
  • "속성창 -> 이벤트"는 클래스 바깥에서 발생한 이벤트(event)를 잡는 COMMAND나 UPDATE_COMMAND_UI 함수를 설정할 수 있다.
  • "속성창 -> 재정의"에서는 현재 클래스의 부모 클래스 기능을 재정의할 수 있다.

class member variable을 추가하려면 "클래스 뷰"로 가서 마우스의 오른쪽 클릭후 "추가 -> 변수 추가"를 누르면 된다.
class wizard를 다시 보고 싶으면 VS2010을 사용해야 한다. MS도 class wizard의 중요성을 다시 인식한 것인지 VS2010부터는 다시 부활했다.