source

LPCTR, LPCTTR 및 LPTSTR

myloves 2023. 4. 19. 00:44

LPCTR, LPCTTR 및 LPTSTR

「 」의 입니까?LPCSTR,LPCTSTR ★★★★★★★★★★★★★★★★★」LPTSTR

을 ""로 이 한 이유는 입니까?LV_ITEM 변수 " " "pszText

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);

질문의 첫 번째 부분에 답변하려면:

LPCSTRconst 문자열에 대한 포인터입니다(LP는 긴 포인터를 의미합니다).

LPCTSTR입니다.const TCHAR (실행,)TCHARUNICODE가 프로젝트에 정의되어 있는지 여부에 따라 와이드 문자 또는 문자 중 하나가 됩니다.)

LPTSTR (비정수)의 입니다.TCHAR

지금까지, 이러한 것에 대해 이야기할 때는, 「a」의 포인터(pointer to a)의 문구를 간단하게 해 왔습니다만, 「lightness-in-orbit」라고 하는 것은 모두 포인터입니다.

이것은 C++ 문자열을 설명하는 훌륭한 코드프로젝트 기사입니다(다양한 유형을 비교한 차트는 아래 2/3 참조).

빠르고 지저분함

LP== 긴 포인터.포인터나 char*만 생각해주세요

C= Const, 이 경우는 포인터가 const가 아니라 const라는 의미라고 생각합니다.

STRis 문자열

T는 컴파일러 옵션에 따라 와이드 문자 또는 문자(TCHAR)를 나타냅니다.

보너스 읽기

LPTSTR의 문자 "T"는 무엇을 나타냅니까?archive

LPTSTR의 문자 "T"는 무엇을 의미합니까?

2006년 10월 17일

LPTSTR의 'T'는 TCHAR의 'T'에서 유래합니다.확실히는 모르겠지만, '텍스트'의 약자인 것 같아요.이에 비해 WCHAR의 W는 C언어 표준에서 유래한 것으로 생각됩니다.C언어 표준에서는 Wide를 나타냅니다.

8 비트 ANSI 스트링

  • char: 8비트 문자(기본 C/C++ 데이터 유형)
  • CHAR: " " " "char 타입Windows 데이터 타입)
  • LPSTR null 종단 : "terminated"CHAR (긴 포인터)
  • LPCSTR: 의 상수 늘 " " " " " " "CHAR (긴 포인터 상수)

16비트 Unicode Strings

  • wchar_t: 16비트 문자(기본 C/C++ 데이터 유형)
  • WCHAR: " " " "wchar_t 타입Windows 데이터 타입)
  • LPWSTR null 종단 : "terminated"WCHAR (긴 포인터)
  • LPCWSTR: 의 상수 늘 " " " " " " "WCHAR (긴 포인터 상수)

UNICODE

  • TCHAR: " " " "WCHAR되어 있는 , UNICODE가 정의되어 있지 않은 경우 UNICODE가 정의되어 있는 경우.CHAR
  • LPTSTR null 종단 : "terminated"TCHAR (긴 포인터)
  • LPCTSTR: 의 상수 늘 " " " " " " "TCHAR (긴 포인터 상수)

그래서:

아이템 8비트(Ansi) 16비트(와이드) 다르다
성격 CHAR WCHAR TCHAR
스트링 LPSTR LPWSTR LPTSTR
문자열(계수) LPCSTR LPCWSTR LPCTSTR

보너스 읽기

TCHAR 문자(archive.is)


디폴트 8비트 코드페이지는 왜 "ANSI"라고 불리고 있습니까?

UnicodeWindows XP에서
Cathy Wissink
매니저,, Windows 프로그램 매니저
코퍼레이션
5월 © 5 ★

Windows NT 3.1에서는 Unicode가 기본적으로 지원되고 있지만, 시스템에 포함된 많은 상위 수준의 응용 프로그램 및 컴포넌트에 대해서는 코드 페이지 지원이 계속 필요했습니다.이것에 의해, Win32 API의 「W」[wide]또는 「Unicode」버전이 아닌 「A」버전이 널리 사용되고 있는 것을 알 수 있습니다.(Windows 코드 페이지를 나타내기 위해 사용되는 "ANSI"라는 용어는 과거 참조용어이지만 오늘날 Windows 커뮤니티에서 계속 사용되고 있는 잘못된 명칭입니다.이 원인은 Windows 코드페이지 1252가 원래 ISO 표준 8859-1이 된 ANSI 초안에 기반하고 있다는 사실에서 비롯되었습니다.다만, ISO 표준의 제어 코드용으로 예약된 범위에 코드 포인트를 추가하는 경우, 원래 ISO에서 벗어난 ISO 8859-x 시리즈를 기반으로 한 Windows 코드 페이지 1252 및 후속 Windows 코드 페이지를 추가합니다.지금까지 개발 커뮤니티에서는 Microsoft 내외를 불문하고 8859-1 코드 페이지를 Windows 1252와 혼동하거나 Windows 코드 페이지의 지원을 나타내는 「ANSI」또는 「A」를 참조하는 일이 드물지 않습니다.)

존과 팀의 답변에 추가.

Win98을 코딩하지 않는 한 어플리케이션에서 사용하는6+ 문자열 타입은 2개뿐입니다.

  • LPWSTR
  • LPCWSTR

나머지는 ANSI 플랫폼 또는 이중 컴파일을 지원하는 것을 의미합니다.그것들은 오늘날 예전만큼 적절하지 않다.

질문의 두 번째 부분에 답하기 위해서는 다음과 같은 것들을 해야 합니다.

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);

'MS'이기 때문에LVITEM에는 '''가 .LPTSTR(즉, 가변형 T-string 포인터이며,LPCTSTR 있는 일은

변환 1) 변환string)CStringLPCTSTR 이것은 를 읽기 포인터로 하는 것을 합니다).

그 포인터를 합니다.constness. -ness.

무엇이냐에 dispinfo 해서 '아까부터', '아까부터', '아까부터', '아까부터'의 때 합니다.ListView콜은 결국 그것을 통해 쓰려고 할 것이다.pszText만약 그렇다면 이는 매우 나쁜 것일 수 있습니다.결국 읽기 전용 포인터가 주어지고 쓰기 가능한 포인터로 취급하기로 결정되었습니다.을 사용하다

의 경우CString함께 작업하고 있는 고객에게는string.GetBuffer()--그것은 의도적으로 당신에게 쓰기 가능한 것을 준다.LPTSTR그럼 잊지 말고 전화하세요.ReleaseBuffer()스트링이 변경되었을 경우.또는 로컬 임시 버퍼를 할당하고 문자열을 거기에 복사할 수 있습니다.

%는 합니다.LPCTSTRLPTSTR 어느 이 예상하지 못했을 ...「 」 「 」 、 「 」 、 「 」 。

'그러다' 입니다.CString클래스는 디자인으로 직접 타입캐스트 변환을 제공하지 않으며, 당신이 하고 있는 것은 일종의 부정행위입니다.

더 긴 대답은 다음과 같습니다.

를 할 수 있는 CString로로 합니다.LPCTSTR은 CString을 이 입니다.operator= 변환은 .로 한정됩니다.LPCTSTR이 포인터로 문자열 값을 수정할 수 없습니다.

.operator=CStringLPSTR되지 않습니다이러한 방식으로 문자열 값을 변경하는 것을 허용하지 않습니다.

따라서 기본적으로 요령은 연산자 CString을 사용하여 다음을 얻는 것입니다.

LPTSTR lptstr = (LPCTSTR) string; // CString provide this operator overload

이제 LPTSTR을 LPSTR에 추가로 입력할 수 있습니다.

dispinfo.item.pszText = LPTSTR( lpfzfd); // accomplish the cheat :P

LPTSTR한 예CString'은 CString'을 말합니다.

CString str = _T("Hello");
LPTSTR lpstr = str.GetBuffer(str.GetAllocLength());
str.ReleaseBuffer(); // you must call this function if you change the string above with the pointer

경우에도 GetBuffer()가 반환되기 때문에LPTSTR 다음과 같이 할 수 .

언급URL : https://stackoverflow.com/questions/321413/lpcstr-lpctstr-and-lptstr