LPCWSTR은 무엇을 의미하며 어떻게 처리해야합니까?


91

우선 정확히 무엇입니까? 포인터라고 생각합니다 (LPC는 긴 포인터 상수를 의미 함). "W"는 무엇을 의미합니까? 특정 문자열에 대한 포인터입니까 아니면 특정 문자열에 대한 포인터입니까? 예를 들어 "TestWindow"라는 창을 닫고 싶습니다.

HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);

코드가 불법이며 const char [6]을 CONST WCHAR로 변환 할 수 없기 때문에 작동하지 않습니다. 나는 전혀 이해하지 못한다. 이 모든 LPCWSTR, LPCSTR, LPSTR에 대해 명확하게 이해하고 싶습니다. 무언가를 찾으려고했지만 더욱 혼란스러워졌습니다. msdn 사이트에서 다음 FindWindowEx과 같이 선언됩니다.

HWND FindWindowEx(      
    HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);

따라서 마지막 매개 변수는 LPCSTR이고 컴파일러는 LPCWSTR을 요구합니다. 도와주세요.


61
Microsoft 헝가리어 표기법에 오신 것을 환영합니다.
Thomas Matthews

2
그것은 실제로 훨씬 더 읽기 쉬운 문서를 만들고, 그것에 관한 다른 모든 것을 유감스럽게 생각합니다.
Matt Joiner

1
@Thomas : 이것은 Microsoft (또는 Simonyi)가 처음에 Hungarian Notation 태그를 붙인 것이 아닙니다 . 문서 그룹이 일부 "가독성"개선을 실행하기로 결정한 사고의 결과입니다. 그들은 개발자가 아니었고 결과적으로 변경 사항이 우아하지 않았습니다. 배경 정보는 Hugarian 표기법 으로 제공됩니다. 이제 내 차례입니다. :)
IInspectable

@IInspectable : 깨진 링크
니콜라스 라울

답변:


137

LPCWSTR"Long Pointer to Constant Wide String"의 약자입니다. W는 Wide를 나타내며 문자열이 일반 문자와 비교하여 2 바이트 문자로 저장됨을 의미합니다 char. 비 ASCII 전용 문자열을 처리해야하는 모든 C / C ++ 코드에 공통입니다.

일반 C 리터럴 문자열을 가져 오려면 LPCWSTR L 접두사를 사용해야합니다.

LPCWSTR a = L"TestWindow";

8
확장하기 만하면- 'LONG'부분은 16 비트 윈도우의 숙취이며 무시할 수 있습니다 (예를 들어 이름에 필요)
Martin Beckett

14
"16 비트 Windows의 숙취"-확실합니다!
John Dibling

4
아니요, 맞습니다. 32 비트 포인터였습니다. 더 이상 "짧은"16 비트 포인터가 없기 때문에 SPCWSTR.
MSalters

51
맙소사. 엘??? 편지 L? 함수도 아닌 L ()? 그냥 평범한 L? 도대체 누가 그것을 생각해 냈습니까 ??
john ktejik

13
@ user396483 많은 언어에서 상수에 접두사와 접미사를 추가하여 인간에게 의미를 변경하지 않고 표현 방식을 변경하는 것이 일반적입니다. 예를 들어 36ULC #에서는 다음과 같습니다 (ulong)36(부호없는 64 비트 정수). @문자열의 접두사로 동일한 언어로 사용할 수 있으므로 구문 분석 방법이 약간 변경됩니다.
Zenexer 2013-07-19

12

LPCWSTR 다음과 같다 wchar_t const * . 함수 호출에 의해 수정되지 않는 넓은 문자열에 대한 포인터입니다.

LPCWSTR문자열 리터럴에 L을 추가 하여 s에 할당 할 수 있습니다 .LPCWSTR *myStr = L"Hello World";

LPC T STR 및 기타 T 유형은 프로젝트의 유니 코드 설정에 따라 문자열 유형을 취합니다. _UNICODE프로젝트에 대해 정의 된 경우 T 유형의 사용은 와이드 문자 형식과 동일하고 그렇지 않으면 Ansi 형식입니다. 적절한 기능은이 방법으로 호출됩니다 : FindWindowEx로 정의 FindWindowExA또는 FindWindowExW이 정의에 따라 달라집니다.


7

이것은 일정한 넓은 문자열 (즉, 넓은 문자열)에 대한 긴 포인터입니다.

그것은 넓은 문자열이기 때문에 상수를 다음과 같이 만들고 싶습니다 L"TestWindow". 중간도 생성하지 않고 매개 변수를 a전달 L"TestWindow"합니다.

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");

pedantically 정확하고 싶다면 "LPCTSTR"은 "텍스트"문자열입니다. 유니 코드 빌드에서는 넓은 문자열이고 ANSI 빌드에서는 좁은 문자열이므로 적절한 매크로를 사용해야합니다.

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));

하지만 유니 코드와 ANSI 문자 집합 모두에 대해 컴파일 할 수있는 코드를 생성하는 데 관심이있는 사람은 거의 없으며 제대로 작동하지 않으면 약간의 이득을 위해 상당한 추가 작업이 필요할 수 있습니다. 이 특별한 경우에는 추가 작업이 많지 않지만 문자열을 조작하는 경우 올바른 함수로 확인되는 전체 문자열 조작 매크로 집합이 있습니다.


1
pedantically 정확할 필요는 없습니다. _T (MAIN_WINDOW)와 같은 상수를 사용하는 경우 _T ()를 사용하십시오. 그렇지 않으면 LMAIN_WINDOW가 실패합니다.
Rodolfo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.