2011년9월7일_winAPI_문자열테이블(String Table)
● 전체 소스코드
▷ main.cpp
▷ MsgProc.h
▷ MsgProc.cpp
메뉴 – Insert - Resource를 선택하여 리소스를 추가하자.
abc모양 아이콘의 String Table을 선택하고 New버튼을 클릭하여 새로운 문자열 테이블을 만든다.
파란 막대로 칠해진 빈 칸을 더블클릭하여 속성창을 열고,
ID는 디폴트로 정해진 그대로 두고 Caption에 아무 문자열을 입력하고 닫자.
실행파일과 링크를 위해..
LoadString(g_hlnst, IDS_STRING1, str, sizeof(str)); |
LoadString()를 사용해 문자열테이블에서 문자열을 불러 온다.
이 함수의 원형은 다음과 같다.
int LoadString(HINSTANCE hInstance, // 프로그램의 인스턴스(객체) 핸들
UINT uID, // 문자열 테이블 ID LPTSTR lpBuffer, // 문자열을 읽을 버퍼 int nBufferMax); // 버퍼의 길이 (Byte단위) |
프로그램의 인스턴스 핸들은 WinMain() 시작시 첫 번째 인자로, WinMain() 내부에서만 사용할 수 있으므로..
다른 함수나 다른 소스파일에서도 사용할 수 있도록 해야한다.
main.cpp
HINSTANCE type으로 WinMain()위에 핸들을 선언하고, WinMain() 안에서 그 핸들에 인스턴스값을 대입한다.
MsgProc.h
MsgProc.cpp는 메시지맵에 등록된 함수들이 있는 곳으로 실제 메시지 발생시 하는 일이 있으므로,
여기에서 프로그램 인스턴스 핸들을 사용해야 한다.
main.cpp에 선언된 변수를 사용하기 위해 extern지시어를 사용해 외부변수라는 것을 지정하여,
링크시에 서로 참조할 수 있도록 한다.
다른 방법으로…
GetModuleHandle()을 사용하여 현재 실행 중인 프로그램의 인스턴스를 리턴받아 넣는 방법도 있다.
이렇게 문자열 테이블을 사용하면 다음과 같은 장점이 있다.
● 문자열테이블 사용시 장점
① 문자열 자체가 코드와 분리됨으로써 문자열만 따로 관리할 수 있으며 프로젝트를 유지하는데 큰 도움을 준다.
매크로의 장점과 유사하다. 프로그래머와 메시지 문자열을 관리하는 사람이 따로 있어, 프로그래머는 코드에만 집중하고, 메시지 문자열은 문장가에게 맡기면 문체의 일관성과 내용이 충실해진다. ② 다국어 버전을 쉽게 만들 수 있다. 소스코드와 리소스가 분리되어 있으므로 언어를 바꿀 때 리소스만 바꾸면 된다. ③ 개발속도 + 메모리의 효율적인 사용 (②과 같은 이유) |