ATL 및 MFC 문자열 변환 매크로
여기서 설명 하는 문자열 변환 매크로 모두 ATL 및 MFC에 대 한 유효 합니다.MFC 문자열 변환에 대 한 자세한 내용은 TN059: MFC MBCS/유니코드 변환 매크로 사용 하 여 및 MFC 매크로 전역 변수.
ATL 7.0 문자열 변환 클래스 및 매크로
3.0 ATL 문자열 변환 매크로
ATL 7.0 문자열 변환 클래스 및 매크로
ATL 7.0 상당한 개선을 통해 기존 매크로 제공 여러 새 변환 클래스 및 매크로 소개 합니다.
새 문자열 변환 클래스 및 매크로 이름이 있는 형태로 되어 있습니다.
CSourceType2CDestinationTypeEX
다음은 각 문자에 대한 설명입니다.
기존의 및 DestinationType 아래 표에 설명 되어 있습니다.
C 처 때 대상 형식 이어야 상수입니다.
EX 때 버퍼의 초기 크기 지정 해야 템플릿 인수로 표시 됩니다.
원본 형식/DestinationType
설명
A
ANSI 문자열입니다.
W
유니코드 문자열입니다.
T
일반 문자열 (_UNICODE 때 정의 되 고 해당 하는 그렇지 않으면 W 10).
OLE
OLE 문자열 (W 10)입니다.
예를 들어, 유니코드 문자열에서 변환 된 문자열을 변경 하지 않고 일반 문자열로 변환할 수 CW2CT.
변환 된 문자열 64 자 일 수 있는지 알고 있는 경우는 EX 버전, 같은 **CW2CTEX <64>**를 사용 하 여 스택에 공간을 절약할 수 있습니다.
[!참고]
BSTR 문자열 변환 방식을 사용 하는 것은 CComBSTR 클래스입니다.BSTR를 변환 하려면 생성자에 기존 문자열을 전달 합니다. CComBSTR. BSTR에서 변환 사용 COLE2CDestinationTypeEX, 같은 COLE2T.
필요한 버퍼의 새 변환 클래스 (CA2AEX, CA2WEX, CW2AEX, 및 CW2WEX) 변환의 결과 저장 하는 고정 크기 정적 버퍼를 사용 합니다.정적 버퍼에 비해 너무 큰 경우 결과 클래스를 할당 메모리를 사용 하 여 malloc, 개체가 범위를 벗어날 때 메모리를 확보 합니다.이 오래 된 텍스트 변환 매크로 달리 이러한 클래스 안전 루프에서 사용 하는 스택 오버플로가 발생 하지 않습니다, 수 있습니다.
ATL 7.0에서 도입 된 매크로 변환의 입력에 최적화 된 NULL 문자열입니다.이러한 매크로 반환 NULL 는 입력 매개 변수가 NULL 메모리를 할당 하지 않고.
기본적으로 ATL 변환 클래스 및 매크로 현재 스레드의 ANSI 코드 페이지 변환에 사용 합니다.특정 클래스에 따라 매크로 사용 하 여 변환에 대 한 동작을 재정의 하려는 경우 CA2WEX 또는 CW2AEX, 코드 페이지 클래스의 생성자는 두 번째 매개 변수로 지정 합니다.
보안 정보 |
---|
이러한 잠재적인 버퍼 오버런 문제를 방지 하려면이 매크로에 전달 하기 전에 문자열의 길이 확인 합니다.스택 오버플로 catch 할 수 시도 / 제외 되는 예외입니다. |
이전 문자열 변환 매크로 및 새 문자열 변환 클래스 간의 몇 가지 중요 한 차이점이 있습니다.
기존 ATL 3.0 매크로 변환 |
새 ATL 7.0 변환 클래스 |
---|---|
스택에 메모리를 할당합니다. |
사용 메모리 작은 문자열에 대해 스택.힙 스택 큰 경우에 사용 합니다. |
문자열은 함수가 종료 될 때 해제 됩니다. |
문자열은 변수가 범위를 벗어날 때 해제 됩니다. |
예외 처리기에서 사용할 수 없습니다. |
예외 처리기에서 사용할 수 있습니다. |
루프에 사용 하기 위해 적합 하지 않습니다.함수가 종료 될 때까지 메모리 사용을 증가 합니다. |
지원에서 루프를 사용합니다.루프 범위 메모리 확인 반복 해제 됩니다. |
큰 문자열에 대 한 것이 없습니다.스택 공간이 제한 됩니다. |
큰 문자열에는 문제가 없습니다.문자열 힙에 할당 됩니다. |
보통 USES_CONVERSION 정의에 필요 합니다. |
절대로 USES_CONVERSION 정의할 수 있어야 합니다. |
OLE의 의미 OLE2ANSI 정의에 따라 달라 집니다. |
OLE 작업을 항상 같습니다. |
예제
코드
//Example 1
// Convert LPCWSTR to LPCSTR.
void ExampleFunction1(LPCWSTR pszW)
{
// Create an instance of CW2A, called pszA,
// and initialize it with pszW.
CW2A pszA(pszW);
// pszA works like an LPCSTR, and can be used thus:
ExampleFunctionA(pszA);
// Note: pszA will become invalid when it goes out of scope.
}
// Example 2
// Use a temporary instance of CW2A.
void ExampleFunction2(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// and initialize it with pszW.
ExampleFunctionA(CW2A(pszW));
// Note: the temporary instance becomes invalid
// after the execution of the statement above.
}
// Example 3
// Incorrect use of conversion macros.
void ExampleFunction3(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// save a pointer to it and then delete
// the temportary instance.
LPCSTR pszA = CW2A(pszW);
// The pszA in the following line is an invalid pointer,
// as the instance of CW2A has gone out of scope.
ExampleFunctionA(pszA);
}
임시 클래스 인스턴스에 대 한 경고
다음 좋은 코드가 아닌 것 없어 해야 합니다.
LPCTSTR szr = CA2T(szReplaceFile);
ATL 3.0 매크로 사용 하 여 사용 하는 것이 있었습니다.
LPCTSTR szr = A2T(szReplaceFile);
변환 함수에 의해 할당 된 메모리는 현재 함수를 종료 될 때까지 해제 되지 않는 경우새 클래스와 같은 코드를 사용할 수 없습니다.
이 코드:
LPCTSTR szr = CA2T(szReplaceFile);
다음과 동일 합니다.
LPCTSTR szr;
{
CA2T temp(szReplaceFile);
szr = temp.operator LPTSTR();
}
캐스트 연산자에서 반환 되는 임시 개체에 의해 할당 된 메모리는 임시 개체가 소멸 되 면 소멸 되 면 값을 사용 하 여 szr 원치 않는 결과 갖습니다.
대신,이 코드를 사용 하십시오.
CA2T szr(szReplaceFile);
캐스트 연산자는 CA2T 개체 처럼 하는 LPCTSTR.
고급 사용
기본 정적 버퍼 크기는 128 자입니다.특정 변환을 위해 버퍼 크기를 변경 해야 하는 경우 EX 버전 매크로의 사용 및 버퍼 크기를 템플릿 인수로 지정 합니다.
// Example 4
// Changing the size of the buffer.
void ExampleFunction4(LPCWSTR pszW)
{
// Use a 16-character buffer.
ExampleFunctionA(CW2AEX<16>(pszW));
}
다음은 코드 페이지 클래스의 생성자는 두 번째 매개 변수로 지정 하는 예제입니다.
// Example 5
// Specifying the code page.
void ExampleFunction5(LPCWSTR pszW)
{
// Convert to the Macintosh code page
ExampleFunctionA(CW2A(pszW, CP_MACCP));
}
3.0 ATL 문자열 변환 매크로
원래 텍스트 변환 매크로 사용할 수 있으며 아래 표에 나열 된:
3.0 ATL 문자열 변환 매크로
A2BSTR |
OLE2A |
T2A |
W2A |
A2COLE |
OLE2BSTR |
T2BSTR |
W2BSTR |
A2CT |
OLE2CA |
T2CA (사용 되지 않음.Use T2CA_EX or CT2CA instead.) |
W2CA |
A2CW |
OLE2CT |
T2COLE |
W2COLE |
A2OLE |
OLE2CW |
T2CW |
W2CT |
A2T |
OLE2T |
T2OLE |
W2OLE |
A2W |
OLE2W |
T2W |
W2T |
이러한 매크로 사용 하는 구문은 다음과 같습니다.
MACRONAME( string_address )
예를 들면 다음과 같습니다.
A2W(lpa);
매크로 이름에 원본 문자열 형식 왼쪽에 있습니다 (예를 들어, A) 하 고 대상 문자열 형식에 적합 (예를 들어, W).A stands for LPSTR, OLE stands for LPOLESTR, T stands for LPTSTR, and W stands for LPWSTR.
경우는 C 매크로 변환 매크로 이름에는 const 문자열.예를 들어, W2CA 변환 된 LPWSTR 에 LPCSTR.
따라서 A2W 변환 된 LPSTR 에 LPWSTR, OLE2T 변환는 LPOLESTR 에 LPTSTR등.
ATL 문자열 변환 매크로의 동작을 컴파일러 지시문에 효과 있으면 달라 집니다.원본 및 대상 형식이 같으면 변환이 수행 됩니다.컴파일러 지시문 변경 T 및 OLE 같이:
컴파일러 지시문에 효과 |
T가 됩니다. |
OLE가 됩니다. |
---|---|---|
없음 |
A |
W |
_UNICODE |
W |
W |
OLE2ANSI |
A |
A |
_UNICODE 및 OLE2ANSI |
W |
A |
_를 사용 하 여 대상 문자열을 만듭니다alloca를 제외 하 고 대상 형식이 되 면 BSTR._를 사용 하 여alloca 함수가 반환 될 때 자동으로 정리 되는 메모리는 스택에서 할당 됩니다.기본적으로이 매크로 500KB까지 한 번에 변환 됩니다.
ATL 문자열 변환 매크로 사용 하는 경우 지정 된 USES_CONVERSION 매크로 컴파일러 오류가 발생 하지 않도록 하려면 함수 시작 부분에.예를 들면 다음과 같습니다.
void StringFunc(LPSTR lpsz)
{
USES_CONVERSION;
LPWSTR x = A2W(lpsz);
// Do something with x
wprintf_s(L"x is %s", x);
}
요구 사항
헤더 파일: AtlBase.h, AtlConv.h (Atlconv.h에 선언 됨)
참고 항목
참조
DEVMODE와 TEXTMETRIC 문자열 변환 매크로