다음을 통해 공유


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 작업을 항상 같습니다.

예제

87zae4a3.collapse_all(ko-kr,VS.110).gif코드

//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);
}

87zae4a3.collapse_all(ko-kr,VS.110).gif임시 클래스 인스턴스에 대 한 경고

다음 좋은 코드가 아닌 것 없어 해야 합니다.

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.

87zae4a3.collapse_all(ko-kr,VS.110).gif고급 사용

기본 정적 버퍼 크기는 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 변환 된 LPWSTRLPCSTR.

따라서 A2W 변환 된 LPSTRLPWSTR, OLE2T 변환는 LPOLESTRLPTSTR등.

ATL 문자열 변환 매크로의 동작을 컴파일러 지시문에 효과 있으면 달라 집니다.원본 및 대상 형식이 같으면 변환이 수행 됩니다.컴파일러 지시문 변경 TOLE 같이:

컴파일러 지시문에 효과

T가 됩니다.

OLE가 됩니다.

없음

A

W

_UNICODE

W

W

OLE2ANSI

A

A

_UNICODEOLE2ANSI

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);
}

87zae4a3.collapse_all(ko-kr,VS.110).gif요구 사항

헤더 파일: AtlBase.h, AtlConv.h (Atlconv.h에 선언 됨)

참고 항목

참조

DEVMODE와 TEXTMETRIC 문자열 변환 매크로

기타 리소스

ATL 매크로