CString 함수는 문자열을 동적으로 저장합니다.
그건 CString 에 문자열을 넣을때에 문자열의 길이만큼 메모리를 잡아서 문자열을 복사한다는 의미죠.
그런데 질문하신 구문을 보면 CString 타입을 그냥 LPCSTR 타입으로 바로 케스팅을 하였는데요
여기서 LPCSTR 은 CString 에서 연산자 재정의를 통해서 CString 의 문자열의 첫번째 포인터를 리턴하도록 만든 것입니다.
보시면 사이의 C 문자가 Const 의 의미로 반환한 문자열 포인터에 들은 값을 변경할 수 없도록 한것이죠.
잘 모르시겠으면 C 나 C++ 책에서 Const 의 의미를 찾아보심이...
CString 타입에 문자열을 복사하도록 구현한 함수가 GetBuffer 함수입니다.
위의 구문을 다시 해보면
CString ss;
GetPrivateporfileString("section","key","",ss.GetBuffer(BUF_SIZE), BUF_SIZE), path);
ss.ReleaseBuffer();
이렇게 해주어야 합니다.
BUF_SIZE 는 원하는 크기를 넣으기구요.
GetBuffer 함수는 인자로 받는 크기만큼의 메모리를 잡아서 char 배열처럼 사용하도록 해주는 함수구요
ReleaseBuffer(); 는 복사된 문자열이 차지한 공간외에 남는 공간이 생기게 되니가 그 남는 공간을 해제해 주기위한 함수입니다.
만인 ss.GetBuffer(100) 으로 생성한 100 바이트의 공간에 20 바이트의 문자열을 복사하게되면 80 바이트나 되는 공간이 남게됩니다.
따라서 복사한 후에 ReleaseBuffer(); 함수를 호출하면 복사된 20바이트는 남겨두고 뒤에 필요없이 남은 80바이트를 나려버리는 겁니다.
단, 그냥 보기에는 뒤의 남는 80바이트를 날리는 것 처럼 보이지만 사실 내부적으로는
유효한 공간인 20바이트를 다른 메모리 영역으로 복사하고 GetBuffer() 에서 생성했던 100바이트의 공간을 해제하는 방식입니다.
이건 뭐 heap 메모리를 컨트롤 해 보면 달리 방법이 없다는 생각이 드실겁니다.
하여간 ReleaseBuffer(); 를 하였다고 해서 복사하였던 문자열까지 날아가는 것은 아니니 Buffer 로서 사용한 후에 바로
ReleaseBuffer(); 함수를 호출해주면 됩니다.
위의 구문이 잘 이해가 안가면 아얘 안전하게 C 언어방식으로 풀어서
CString ss;
chat buffer[BUF_SIZE];
GetPrivateporfileString("section","key","",buffer, BUF_SIZE), path);
ss = buffer;
이런식으로 하시던가요
<출처-데브피아>
GetBuffer()
CString형을 char형으로 변환해주는 것입니다.
전달인자는 버퍼최소크기를 지정하는 것이구요.
보통 0을 사용합니다. CString문자열의 크기만큼 지정되는겁니다
CString으로 선언한 변수를 char*로 바꾸는 방법.
또 반대로 char*로 선언된 변수를 CString으로 바꾸는 방법.
CString <--> char *
CString -> char *
CString str;
str = "Hello";
char* ss = LPSTR(LPCTSTR(str));
char * --> CString
char ss[] = "Hello";
CString str;
str.Format("%s", ss);
(Format대신에 GetBuffer()를 써도 됩니다.)
'Programming' 카테고리의 다른 글
유니코드에 대비한 프로그램을 작성하는 여섯가지 원칙 (0) | 2008.05.09 |
---|---|
이공계 기술자로 살아간다는것.. (0) | 2008.05.09 |
vc 2005 프로젝트설정, 단축키, 이것저것. 설정에러 (0) | 2008.05.09 |