Поделиться через


Макросы преобразования строки библиотеки ATL и MFC

Макросы преобразования, описанные здесь допустимы строки как для библиотеки ATL и MFC.Дополнительные сведения о преобразовании строки MFC см. в разделе TN059: С помощью макросов MFC И MBCS преобразования Юникода и макросы и глобальные MFC.

  • Библиотеки ATL 7,0 классы и макроса преобразования строк

  • Библиотеки ATL 3,0 макроса преобразования строк

Библиотеки ATL 7,0 классы и макроса преобразования строк

Библиотеки ATL 7,0 появились несколько новых классов и макросов преобразования, предоставляя значительные усовершенствования над существующими макросами.

Имена новых классов и макросов преобразования строки имеют форму:

CSourceType2[C]DestinationType[EX]

Здесь:

  • SourceType и DestinationType описаны в таблице ниже.

  • [C] Присутствуют, если целевой тип должен быть постоянным.

  • [EX] Присутствует, когда исходный размер буфера должен быть определен как аргумент шаблона.

    SourceType/DestinationType

    Описание

    A

    Строка символов ANSI.

    W

    Строка символов в юникоде.

    T

    Универсальная строка символов (эквивалент w, когда _UNICODE будет определено, в противном случае число до a).

    OLE

    Символьная строка OLE (эквивалент w).

Например, преобразование из строки в юникоде с универсальным строке, не изменяя преобразованная строка, CW2CT.

Если известно, что преобразованная строка маловероятна, чтобы быть более чем из 64 символов, версию EX, как CW2CTEX<64>, можно использовать, чтобы сохранить место в стеке.

ПримечаниеПримечание

Рекомендуемый способ преобразования в и из строк BSTR использовать класс CComBSTR.Чтобы преобразовать в существующую строку BSTR, передайте конструктору CComBSTR. Чтобы преобразовать строку BSTR, используйте COLE2[C]DestinationType[EX], как COLE2T.

Новые классы преобразования, которые требуют использования буферов (CA2AEX, CA2WEX, CW2AEX и CW2WEX) буфер фиксированного размера статический хранения результата преобразования.Если результат слишком велик, чтобы поместить в буфер статический класс выделяет память с помощью malloc, освобождая память, если объект выходит из области.Это гарантирует, что, в отличие от более старых макросы преобразования текста, эти классы можно использовать для использования в циклах и не переполнят стек.

Макросы преобразования, вставленные в библиотеке ATL 7,0 оптимизированы учитывать строк NULL ввода.Эти макросы, возвращают NULL если входной параметр NULL без выделения любая память.

По умолчанию классы преобразования библиотеки ATL и макросы, будут использовать кодовую страницу ANSI текущую потока для преобразования.Если требуется переопределить, что функциональности для определенного преобразования с помощью макросов, основанные на классах CA2WEX или CW2AEX, укажите кодовую страницу в качестве второго параметра в конструктор класса.

Примечание о безопасностиПримечание по безопасности

Проверьте длина строк, перед передачей их на эти макросы, чтобы избежать возможных проблем переполнения буфера.Переполнения стека исключения, которые могут быть перехвачены с попыткой или except.

Существует несколько важных различий между макросами более старыми и новыми классами преобразования строки преобразования строки:

Старое библиотеки ATL 3,0 макроса преобразования

Создание библиотеки ATL 7,0 класса преобразования

Выделение памяти в стеке.

Память стека польз для небольших строк.Использует кучу, если стек, недостаточно велик.

Строки освобождается при выйти функция.

Строки освобождается, когда переменная выходит из области.

Не может быть использовано в обработчиках исключений.

Может использоваться в обработчиках исключений.

Не подходящий для использования в циклах.Использование памяти увеличивается до тех пор, пока функция не выйти.

Поддержка используется в циклах.Область цикла гарантирует, что память освобождается при каждой итерации.

Не рекомендуется для больших строк.Пространство стека ограничена.

Без проблем с большими строками.Строки будут выделены в куче.

Обычно требуется USES_CONVERSION.

Никогда не требует USES_CONVERSION.

Значение OLE определения зависит от того, OLE2ANSI.

OLE всегда соответствует W.

Пример

87zae4a3.collapse_all(ru-ru,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(ru-ru,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(ru-ru,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));
}

Библиотеки ATL 3,0 макроса преобразования строк

Макросы преобразования исходного текста по-прежнему доступно и перечислены в таблице ниже.

Библиотеки ATL 3,0 макроса преобразования строк

A2BSTR

OLE2A

T2A

W2A

A2COLE

OLE2BSTR

T2BSTR

W2BSTR

A2CT

OLE2CA

T2CA (Нерекомендуемый.Используйте T2CA_EX или CT2CA).

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 означает " LPSTR, OLE означает " LPOLESTR, T означает " LPTSTR и стоек W для LPWSTR.

Если C в имени макроса, макрос преобразования к const строка.Например, W2CA преобразует LPWSTR к LPCSTR.

Таким образом, A2W преобразует LPSTR к LPWSTR, OLE2T преобразует LPOLESTR к LPTSTR и т д

Реакция на событие зависит от макросов преобразования строки библиотеки ATL директива компилятора фактически, если таковые имеются.Если типы источника и назначения совпадают, то преобразование не производится.Изменение T и OLE директивы компилятора следующим образом:

Директива компилятора в силе

T становится

OLE становится

None

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

87zae4a3.collapse_all(ru-ru,VS.110).gifТребования

AtlBase.h AtlConv.h (Header file:, объявленное в AtlConv.h)

См. также

Ссылки

Макросы преобразования строки DEVMODE и TEXTMETRIC

Другие ресурсы

Макросы ATL