답변:
질문의 첫 부분에 답하려면 :
LPCSTRconst 문자열에 대한 포인터 (LP는 Long Pointer를 의미 함 )
LPCTSTRconst TCHAR문자열에 대한 포인터입니다 ( TCHAR프로젝트에 UNICODE가 정의되었는지 여부에 따라 와이드 문자 또는 문자).
LPTSTR상수가 아닌 TCHAR문자열에 대한 포인터입니다.
과거에 이것에 대해 이야기 할 때, 우리는 단순성을 위해 "pointer to a"문구를 생략했지만, lightness-races-in-orbit에서 언급했듯이 그것들은 모두 포인터입니다.
이것은 C ++ 문자열을 설명 하는 훌륭한 코드 프로젝트 문서입니다 (다른 유형을 비교하는 차트는 2/3 참조).
extern "C". 그 외에도 "포인터"비트 또는 C 문자열과 같은 특정 설명이 필요합니다.
빠르고 더러운 :
LP== L 옹 P의 ointer. 포인터 또는 문자 *
C= C onst,이 경우에는 문자열이 const가 아니라 포인터가 const라는 것을 의미한다고 생각합니다.
STR이다 문자열
는 T컴파일 옵션에 따라 다양한 문자 또는 문자 (TCHAR)입니다.
char: 8 비트 문자-기본 C / C ++ 데이터 유형CHAR: 별칭 char-Windows 데이터 유형LPSTR: ( L ong P ointer) 의 null로 끝나는 문자열CHAR LPCSTR: ( L ong P ointer) 의 상수 null로 끝나는 문자열CHAR wchar_t: 16 비트 문자-기본 C / C ++ 데이터 유형WCHAR: 별칭 wchar_t-Windows 데이터 유형LPWSTR: ( L ong P ointer) 의 null로 끝나는 문자열WCHAR LPCWSTR: ( L ong P ointer) 의 상수 null로 끝나는 문자열WCHAR UNICODE정의 에 따라TCHAR: WCHARUNICODE가 정의 된 경우 별칭 ; 그렇지 않으면CHARLPTSTR: ( L ong P ointer) 의 null로 끝나는 문자열TCHAR LPCTSTR: ( L ong P ointer) 의 상수 null로 끝나는 문자열TCHAR 그래서
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR→ 텍스트 문자 ( archive.is )
John과 Tim의 대답에 추가합니다.
Win98 용으로 코딩하지 않는 한, 애플리케이션에서 사용해야하는 6 개 이상의 문자열 유형 중 두 가지만 있습니다.
LPWSTRLPCWSTR나머지는 ANSI 플랫폼 또는 이중 컴파일을 지원하기위한 것입니다. 오늘날에는 예전만큼 관련성이 없습니다.
std::string경우 여전히 ASCII 기반 문자열이기 때문에 피하고 std::wstring대신 선호 합니다.
*AUTF-8 코드 페이지와 호환되는 WinAPI 버전 을 만들기 위해 노력하고 있기 때문에 갑자기 훨씬 더 관련성이 높아졌습니다. ; P
질문의 두 번째 부분에 답하려면 다음과 같은 작업을 수행해야합니다.
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
MS의 LVITEM구조체에는 LPTSTR, 즉 변경 가능한 T- 문자열 포인터 가 있기 때문에LPCTSTR . 당신이하는 일은
1) string( CString추측에 따라)를 LPCTSTR(실제로는 읽기 전용 포인터로 문자 버퍼의 주소를 얻는 것을 의미합니다)
2) 읽기 전용 포인터를 const-ness 를 캐스트하여 쓰기 가능한 포인터로 변환 하십시오.
그것은 dispinfo당신의 ListView전화가 그것을 통해 쓰기 를 시도하게 될 가능성이 있는지 여부에 사용되는 것에 달려 pszText있습니다. 만약 그렇다면, 이것은 잠재적으로 매우 나쁜 일입니다. 결국 당신은 읽기 전용 포인터를 받고 그것을 쓰기 가능으로 취급하기로 결정했습니다. 아마도 그것이 읽기 전용 인 이유가있을 것입니다!
그것은 경우 CString당신이 당신과 함께 작업하고 사용할 수있는 옵션이 string.GetBuffer()의도적으로 당신에게 쓰기를 준다을 - LPTSTR. 그런 다음 ReleaseBuffer()문자열이 변경되면 호출하는 것을 기억해야합니다 . 또는 로컬 임시 버퍼를 할당하고 거기에 문자열을 복사 할 수 있습니다.
99 %의 시간이 불필요하며 유언장으로 취급 LPCTSTR하는 LPTSTR것이 효과가 있지만 언젠가는 예상치 못한 일이 발생합니다 ...
xxx_cast<>()대신 사용해야 합니다.
xxx_cast<> 두 개의 다른 대괄호 기반 캐스팅 스타일을 혼합 것보다 !