무엇을 LPCTSTR
하고 LPCTSTR
(예를 들어 -like HDC
)와 무엇을 의미합니까?
LPCSTR p, q;
당신이 원할 때 항상 놀라움을 나타냅니다 const char *p, *q;
. 사용을 거부 할 수 있습니까?
무엇을 LPCTSTR
하고 LPCTSTR
(예를 들어 -like HDC
)와 무엇을 의미합니까?
LPCSTR p, q;
당신이 원할 때 항상 놀라움을 나타냅니다 const char *p, *q;
. 사용을 거부 할 수 있습니까?
답변:
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
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에서 프로젝트를 실행하지 않는 한 실제로 중요하지 않습니다.
이러한 유형은 MSDN의 Windows 데이터 유형 에 설명되어 있습니다 .
LPCTSTR
이
LPCWSTR
경우UNICODE
AN, 정의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;
나는이 질문이 꽤 오래 전에 요청되었으며 정확한 원래 질문에 직접 대답하려고하지는 않지만이 특정 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
.
WinMain
and InitWindowsApp
함수 를보고 분석해 봅시다 : 첫 번째는 함수 매개 변수 HINSTANCE
와 PSTR
:
WinMain
PSTR 객체 또는 다른 문자열과 int 두 HINSTANCE
객체를 InitWindowsApp
허용 하는 동안 단일 객체를 허용 HINSTANCE
합니다 typedef
.
이 InitWindowsApp
함수는 두 함수의 객체에 대한 설명을 제공하기 때문에 여기서 사용할 것입니다.
첫 번째 HINSTANCE
는 INSTANCE 의 H andle로 정의되며 응용 프로그램에 가장 일반적으로 사용되는 것입니다. 두 번째는 더 이상 거의 사용되지 않는 이전 인스턴스 와 다른 것입니다. 프로세스에서 기존의 많은 응용 프로그램을 손상 시키는 기능 서명 을 변경할 필요가 없도록 레거시 목적으로 유지되었습니다 . 세번째 매개 변수는 인 P의 (A)에 ointer STR의 ING.HANDLE
WinMain()
그래서 우리 자신에게 무엇을 요구해야 HANDLE
합니까? Win32
API
여기 에있는 문서 : Windows 데이터 형식 을 보면 쉽게 찾아서 다음과 같이 정의 된 것을 볼 수 있습니다.
객체에 대한 핸들. 이 형식은 WinNT.h에서 다음과 같이 선언됩니다.
typedef PVOID HANDLE;
이제 우리에게는 또 다른 것이 있습니다 typedef
. 무엇입니까 PVOID
? 글쎄, 분명해야하지만 같은 테이블에서 찾아 보겠습니다 ...
모든 유형에 대한 포인터. 이것은 WinNT.h에 선언되어 있습니다.
typedef void *PVOID;
A HANDLE
는 Win32
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
그 자체는 다음과 같이 선언 된 typedef
A로부터 PVOID
도 인 typedef
A를 void pointer
.
그래서 LPCTSTR
우리는 같은 문서에서 그것을 찾을 수 있습니다 :
그것은으로 정의
LPCWSTR
하면UNICODE
정의 나있다LPCSTR
그렇지 않으면.
#ifdef UNICODE
typedef LPCWSTR LPCSTR;
#else
typedef LPCSTR LPCTSTR;
#endif
그래서 희망이의 용도를 이해하는 방법에 대한 가이드로 도움이 될 것입니다 typedefs
특히와 윈도우 데이터 유형 에서 찾을 수 있습니다 Win32
API
.
HANDLE
를 활성화하면 많은 핸들 유형이 별칭 보다 강력한 유형이 됩니다 STRICT
. 새로운 프로젝트의 기본값은 어느 것입니까?