일반 Win32 프로그램을 제작할 때 문자열 정보는 리소스의 String Table에 넣어두고 사용할 경우가 많습니다.
또한 다중 언어를 지원하는데도 유용하게 사용할 수 있으니까요.
오늘 오랜만에 Pocket PC 에서 개발을 하는 도중 String Table 을 사용하려고 하니 AfxLoadString 을 사용할 수 없더군요.
해서 찾아보니 Windows CE 기반에서는 ::LoadString(HINSTANCE, UINT, LPTSTR, int) 를 사용해야 되더군요.
여기서 MS가 Windows Mobile 기반을 위해서 약간의 기능을 더 추가한 것을 발견했습니다.
보통 스트링 테이블에서 문자열을 가져오기 위해서는 TCHAR szName 등을 선언하고 해당 변수에 문자열 정보를 얻어오는 방식이었는데, 모바일 기기에서는 메모리 절약을 위해서 스트링테이블의 해당 문자열의 포인터를 반환하는 기법을 사용할 수 있더군요.
따라서 아래와 같이 한다면 스트링 테이블의 문자열을 바로 억세스 할 수 있습니다.
LPCTSTR lpName = (LPCTSTR) :: LoadString( hInst, IDS_NAME, NULL, 0 );
위와 같이 버퍼에는 NULL 을 입력해주고, iMax 에는 0 을 입력하면 됩니다.
다만 위와 같이 한다면 아래와 같이 출력됩니다.
위와 같이 스트링테이블의 다음 문자열까지 같이 출력이 되어 버립니다.
이것을 방지하기 위해서는 스트링테이블의 다음 문자열 사이에 널 문자를 추가해주어야 하는데 그것은 리소스 컴파일러 옵션 중 /n 을 통해 가능해집니다.
위 리소스 컴파일러 옵션을 보시면 아시겠지만 /n 을 추가하면 스트링 사이에 널 문자를 추가해서 리소스를 컴파일 합니다.
비주얼 스튜디오에 설정하기위해서는 아래의 그림과 같이 추가해 줍니다.
위와 같이 설정해주면 스트링 사이에 널이 추가되기 때문에 아래와 같이 정상적으로 출력됩니다.
지금까지 이런저런 PPC 프로그램을 만들어봤는데 스트링테이블을 사용하는 것은 처음이라 알게된 좋은 정보네요.
그나저나 이건 어떻게 만든데..@.@a
:)