LPCTSTR은 무엇입니까?


37

무엇을 LPCTSTR하고 LPCTSTR(예를 들어 -like HDC)와 무엇을 의미합니까?



3
이것이 바로 우리가 Microsoft를 좋아하는 이유입니다.
zxcdw

2
이러한 "유형"은 예를 들어 LPCSTR p, q;당신이 원할 때 항상 놀라움을 나타냅니다 const char *p, *q;. 사용을 거부 할 수 있습니까?
ott--

9
가증.
Thomas Eding

2
32 비트 어플리케이션 포팅 64 비트는 기술 용어의 요구
overexchange

답변:


76

MSDN 포럼에서 Brian Kramer 인용

LPCTSTR= L 사연 P의 A와 ointer C onst T CHAR STR 보내고 (하지 걱정, 긴 포인터 포인터와 동일합니다. 포인터의 두 가지 종류가 16 비트 윈도우 아래에 있었다.)

테이블은 다음과 같습니다.

  • LPSTR = char*
  • LPCSTR = const char*
  • LPWSTR = wchar_t*
  • LPCWSTR = const wchar_t*
  • LPTSTR= char* or wchar_t*에 따라_UNICODE
  • LPCTSTR= const char* or const wchar_t*에 따라_UNICODE

29
그 유형 이름을 볼 때마다 나는 울고 싶다고 생각합니다. 불편한 점이 있습니다. (+1 BTW)
Donal Fellows

2
언제 이런 종류의 포인터를 사용해야합니까?
Florian Margaine

@FlorianMargaine API가 지시 할 때. 그때까지 '적절한'유형을 사용하십시오
James

1
여기서주의해야 할 경고가 많이 있습니다. wchar_t는 16 비트 유형이지만 ucs2 및 utf-16으로 인코딩 된 유니 코드 문자를 모두 저장하는 데 사용할 수 있습니다. utf-16은 여러 wchar_t를 사용하여 단일 문자를 인코딩 할 수 있으며, ucs2는 유니 코드 문자 집합의 하위 집합 만 지원합니다. 호출해야하는 API 함수도 사용 된 인코딩에 따라 다릅니다.
Michael Shaw

2
최악의 DWORD는 32 비트 더블 워드 였지만 요즘은 32 비트 하프 워드입니다. :-)
gnasher729

6

TCHAR과 관련된 유형을 사용할 필요가 없습니다.

이러한 유형,이를 사용하는 모든 구조 유형 및 모든 관련 기능은 컴파일시 ANSI 또는 UNICODE 버전 (프로젝트 구성에 따라)으로 매핑됩니다. ANSI 버전에는 일반적으로 이름 끝에 A가 추가되고 유니 코드 버전에는 W가 추가됩니다. 원하는 경우 명시 적으로 사용할 수 있습니다. MSDN은 필요할 때이 점에 주목합니다. 예를 들어 여기에 MessageBoxIndirectA 및 MessageBoxIndirectW 함수가 표시됩니다. http://msdn.microsoft.com/en-us/library/windows/desktop/ms645511(v=vs.85).aspx

많은 유니 코드 함수의 구현이 부족한 Windows 9x를 대상으로하지 않는 한 ANSI 버전을 사용할 필요가 없습니다. Windows 9x를 대상으로하는 경우 코드에서 TCHAR이 char인지 wchar인지에 대한 가정이없는 한 TCHAR을 사용하여 동일한 코드베이스에서 ansi 및 유니 코드 바이너리를 빌드 할 수 있습니다.

Windows 9x에 신경 쓰지 않는다면 프로젝트를 유니 코드로 구성하고 TCHAR을 WCHAR과 동일하게 취급하는 것이 좋습니다. 원하는 경우 W 함수 및 유형을 명시 적으로 사용할 수 있지만 Windows 9x에서 프로젝트를 실행하지 않는 한 실제로 중요하지 않습니다.


0

이러한 유형은 MSDN의 Windows 데이터 유형 에 설명되어 있습니다 .

LPCTSTR

LPCWSTR경우 UNICODEAN, 정의 LPCSTR, 그렇지. 자세한 내용은 문자열에 대한 Windows 데이터 형식을 참조하십시오.

이 형식은 WinNT.h에서 다음과 같이 선언됩니다.

#ifdef UNICODE
 typedef LPCWSTR LPCTSTR; 
#else
 typedef LPCSTR LPCTSTR;
#endif

LPCWSTR

16 비트 유니 코드 문자로 끝나는 null로 끝나는 상수 문자열에 대한 포인터입니다. 자세한 내용은 글꼴에 사용 된 문자 세트를 참조하십시오.

이 형식은 WinNT.h에서 다음과 같이 선언됩니다.

typedef CONST WCHAR *LPCWSTR;

HDC

장치 컨텍스트 (DC)에 대한 핸들 입니다.

이 유형은 WinDef.h에서 다음과 같이 선언됩니다.

typedef HANDLE HDC;

0

나는이 질문이 꽤 오래 전에 요청되었으며 정확한 원래 질문에 직접 대답하려고하지는 않지만이 특정 Q / A는 적절한 평가를 받았으므로 미래 독자를 위해 여기에 조금 추가하고 싶습니다. 이것은 더 구체적 Win32 API typedefs으로 이해하고 이해하는 방법과 관련이 있습니다.

Windows 95에서 Windows 7-8까지 32 비트 시스템 시대에 Windows 프로그래밍을 해본 사람이라면이 프로그램 Win32 API이로드되어 typedefs있고 그 기능과 구조의 대부분이 채워지고 그들에게 크게 의존했습니다.


다음은 데모 용으로 제공되는 기본 Windows 프로그램입니다.

#include <Windows.h>

HWND ghMainWnd = 0;

bool InitWindowsApp( HINSTANCE, int show );
LRESULT CALLBACK WindowProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
int run();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int show ) {
    if ( !InitWindowsApp( hInstance, showCmd ) ) {
        return 0;
    }
    return run();
}

LRESULT CALLBACK WindowProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
    switch( msg ) {
        case WM_KEYDOWN: {
            if ( wParam == VK_ESCAPE ) {
                DestroyWindow( ghMainWnd );
            }
            return 0;
         }
         case WM_DESTROY: {
             PostQuitMessage(0);
             return 0;
         }
         default: {
             return DefWindowProc( hWnd, msg, wParam, lParam );
         }
    }
}

bool InitWindowsApp( HINSTANCE hInstance, int nCmdShow ) {

    WNDCLASSEX wc;

    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc      = WindowProc;
    wc.cbClsExtra       = NULL;
    wc.cbWndExtra       = NULL;
    wc.hInstance        = hInstance;
    wc.hIcon            = LoadIcon( NULL, IDI_APPLICATION );
    wc.hIconSm          = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor          = LoadCursor( NULL, IDC_ARROW );
    wc.lpszMenuName     = NULL;
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszClassName    = L"Basic Window";
    wc.cbSize           = sizeof( WNDCLASSEX);

    if ( !RegisterClassEx( &wc ) ) {
        MessageBox( NULL, L"Register Class FAILED", NULL, NULL );
        return false;
    }

    ghMainWnd = CreateWindow( 
        L"Basic Window",
        L"Win32Basic",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL, NULL,
        hInstance,
        NULL );
    if ( ghMainWnd == 0 ) {
        MessageBox( NULL, L"Window failed to create", L"Error", MB_OK );
        return false;
    }

    ShowWindow( ghMainWnd, nCmdShow );
    UpdateWindow( ghMainWnd );

    return true;    
}

int run() {
    MSG msg = {0};
    BOOL bReturn = 1;

    while( (bReturn = GetMessage( &msg, NULL, NULL, NULL)) != 0 ) {
        if ( bReturn == -1 ) {
            MessageBox( NULL, L"GetMessage FAILED", L"Error", MB_OK );
            break;
        } else {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    return (int)msg.wParam;
}

이것은 Windows 응용 프로그램을 렌더링하기에 충분한 코드입니다. 이것은 기본 창을 렌더링하기 위해 최소한의 최소 속성을 초기화하는 가장 기본적인 설정이며, 보시다시피 기본 창 typedefs에서 이미로드되어 있습니다 Win32 api.


WinMainand InitWindowsApp함수 를보고 분석해 봅시다 : 첫 번째는 함수 매개 변수 HINSTANCEPSTR:

WinMainPSTR 객체 또는 다른 문자열과 int 두 HINSTANCE객체를 InitWindowsApp허용 하는 동안 단일 객체를 허용 HINSTANCE합니다 typedef.

InitWindowsApp함수는 두 함수의 객체에 대한 설명을 제공하기 때문에 여기서 사용할 것입니다.

첫 번째 HINSTANCEINSTANCEH andle로 정의되며 응용 프로그램에 가장 일반적으로 사용되는 것입니다. 두 번째는 더 이상 거의 사용되지 않는 이전 인스턴스 와 다른 것입니다. 프로세스에서 기존의 많은 응용 프로그램을 손상 시키는 기능 서명 을 변경할 필요가 없도록 레거시 목적으로 유지되었습니다 . 세번째 매개 변수는 인 P의 (A)에 ointer STR의 ING.HANDLEWinMain()

그래서 우리 자신에게 무엇을 요구해야 HANDLE합니까? Win32 API여기 에있는 문서 : Windows 데이터 형식 을 보면 쉽게 찾아서 다음과 같이 정의 된 것을 볼 수 있습니다.

객체에 대한 핸들. 이 형식은 WinNT.h에서 다음과 같이 선언됩니다.

typedef PVOID HANDLE; 

이제 우리에게는 또 다른 것이 있습니다 typedef. 무엇입니까 PVOID? 글쎄, 분명해야하지만 같은 테이블에서 찾아 보겠습니다 ...

모든 유형에 대한 포인터. 이것은 WinNT.h에 선언되어 있습니다.

typedef void *PVOID;

A HANDLEWin32 API다음과 같은 것들 에서 많은 객체를 선언하는 데 사용 됩니다.

  • HKEY -레지스트리 키에 대한 핸들. WinDef.h에서 선언
    • typdef HANDLE HKEY;
  • HKL -로캘 식별자에 대한 핸들입니다. WinDef.h에서 선언
    • typdef HANDLE HKL;
  • HMENU -메뉴 핸들. WinDef.h에서 선언
    • typdef HANDLE HMENU;
  • HPEN -펜 손잡이. WinDef.h에서 선언
    • typedef HANDLE HPEN;
  • HWND -창문 손잡이. WinDef.h에서 선언
    • typedef HANDLE HWND;
  • ... 등과 같은 HBRUSH, HCURSOR, HBITMAP, HDC, HDESK, 등

이들은 모두 typedefs사용하여 선언되는 typedef을 인을 HANDLE하고, HANDLE그 자체는 다음과 같이 선언 된 typedefA로부터 PVOID도 인 typedefA를 void pointer.


그래서 LPCTSTR우리는 같은 문서에서 그것을 찾을 수 있습니다 :

그것은으로 정의 LPCWSTR하면 UNICODE정의 나있다 LPCSTR그렇지 않으면.

#ifdef UNICODE
  typedef LPCWSTR LPCSTR;
#else
  typedef LPCSTR LPCTSTR;
#endif

그래서 희망이의 용도를 이해하는 방법에 대한 가이드로 도움이 될 것입니다 typedefs특히와 윈도우 데이터 유형 에서 찾을 수 있습니다 Win32 API.


매크로 HANDLE를 활성화하면 많은 핸들 유형이 별칭 보다 강력한 유형이 됩니다 STRICT. 새로운 프로젝트의 기본값은 어느 것입니까?
Sebastian Redl

@SebastianRedl 그것은 될 수 있었다; 그러나 나는 너무 심도 깊은 API와 강하게 타이핑 된 언어 측면의 엄격함으로 들어 가려고하지 않았습니다. typedef를 사용하여 Win32 API 및 해당 데이터 유형에 대한 개요를보다 자세히 설명했습니다.
Francis Cugler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.