Posted by 아..몰라 ㅡ.ㅡ+
,

ATL and MFC string conversion macro를 사용할 때 주의할 점이 있다.

반드시 지켜야할 주의점과 알아둘 것.


■ 반드시 지켜야 할것.

conversion macro를 사용할때, 보통은 잘 되는데, 대량의 데이터를 변환하는 경우 프로그램이 죽는 현상이 생긴다.

이것은 macro가 stack 메모리를 사용하기 때문에 할당할 수 있는 메모리가 1MB이내라서 지역안에서 1MB 이상의 변환을 시도하면 overflow가 나는 것이다.

MSDN문서에서 찾은것은 아니고, 경험담이다;

1MB이상의 변환이 예상되는 부분에는 macro 대신

WideCharToMultiByte, MultiByteToWideChar API를 이용하는것이 안전한다.


■ 알아두어야 할 것

default static buffer size는 128 character 또는 64 character다. ㅡ.ㅡ?


MSDN 문서의 상단부분에 있는 설명에는 64 characters가 넘어가면 EX version을 쓰라고 나오고, 문서 하단에는 default static buffer size는 128 characters 라고 나온다. 뭥미?


대략 128바이트라고 생각되나 정확한것이 아니니  변환할 대상 string이 64글자가 넘어가는 경우 EX가 붙은 매크로를 사용하자.


Ex)

// Changing the size of the buffer.
void ExampleFunctionW( LPCWSTR pszW )
{
   // Use a 16-character buffer.
   ExampleFunctionA( CW2CAEX< 16 >( pszW ) );
}

<>안에 숫자가 buffer크기가 된다.


그런데 코드를 작성해서 테스트 해보면

64글자, 128글자가 넘어도 잘 변환된다. ㅡ.ㅡ


그래도 혹시나 나중에 문제가 생길지도 모르니 알아두자.

Posted by 아..몰라 ㅡ.ㅡ+
,

ATL string conversion macro로 CT2A 라는 매크로가 있었다.

Unicode string을 ANSI string으로 변환할때 쓰던 매크로인데, 

이전에 USES_CONVERSION 매크로와 함께 쓰던 W2A와 같은 기능을 하는 매크로 였다.


그런데 한달전까지 잘 쓰던 매크로가 갑자기 없어졌다.


확인해보니까 \Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include 경로에 있는

atlconv.h 의 수정 날짜가 2012-11-13 이다. !!!


windows 업데이트를 통해 변경이 되었는지, 

visual studio 2012 express 또는 windows sdk 8.0을 설치해서 변경된 것인지는 확인하지못했다.

시스템 복원지점이 그 시점까지가 남아있지 않아서 ㅡ.ㅡ;


앞으로는 기존에 쓰던 CT2A 매크로는 CW2CA나 W2A로 대체해야할 것이다.


(참고로 매크로 앞에 붙은 C는 destination type을 constant로 한다는 의미. )


■ 요점

- API 함수나 매크로가 하위호환성 고려없이 없어지는 경우도 있다. ㅡ.ㅡ


Posted by 아..몰라 ㅡ.ㅡ+
,