ATL i MFC ciąg konwersja makr
Makra konwersji ciągu omawiane są prawidłowe dla ATL i MFC.Aby uzyskać więcej informacji o konwersji ciągu MFC, zobacz TN059: przy użyciu makra konwersji MBCS/Unicode MFC i makra MFC i Globals.
Klasy konwersji ciągu 7.0 ATL i makra
ATL ciąg 3.0 konwersji makra
Klasy konwersji ciągu 7.0 ATL i makra
ATL 7.0 wprowadzono wiele nowych klas konwersji i makra, zapewniając znaczną poprawę powyżej istniejącego makra.
Nazwy nowych klas konwersji ciągu i makra formę:
CŹródłowa2[C]DestinationType[EX]
w przypadku gdy:
Źródłowa i DestinationType są opisane w poniższej tabeli.
[C] jest obecnie, gdy typ docelowy musi być stała.
[EX] jest obecnie, kiedy należy określić początkowy rozmiar buforu jako argumentu szablonu.
Źródłowa/DestinationType
Opis
ELEMENT
Ciąg znaków ANSI.
W
Ciąg znaków Unicode.
T
Ciąg znaków ogólny (odpowiednikiem W po _UNICODE jest zdefiniowana, odpowiada A inaczej).
OLE
Ciąg znaków OLE (równoważna W).
Na przykład można przekonwertować ciągu Unicode na ciąg ogólnego bez zmiany skonwertowany ciąg, należy użyć CW2CT.
![]() |
---|
Niektóre z kombinacji wzorzec wymienione powyżej nie są obsługiwane.CA2CW i CW2CA (i CA2CWEX i CW2CAEX) nie są obsługiwane.Dla OLE znaku konwersji ciągów tylko COLE2T i CT2OLE (i COLE2CT, COLE2TEX, COLE2CTEX, CT2COLE, CT2OLEEX, i CT2COLEEX) są obsługiwane.Aby uzyskać szczegółowe informacje Zobacz atlconv.h. |
Jeśli wiadomo, że skonwertowany ciąg nie może zawierać więcej niż 64 znaków EX wersji, takich jak CW2CTEX<64>, może służyć do zapisu miejsca na stosie.
[!UWAGA]
Zalecanym sposobem konwersji do i z ciągów BSTR jest używanie CComBSTR klasy.Aby dokonać konwersji typu BSTR, przekazania istniejący ciąg do konstruktora CComBSTR.Aby dokonać konwersji z typu BSTR, należy użyć COLE2[C]DestinationType[EX], takich jak COLE2T.
Nowe klasy konwersji, które wymagają bufora (CA2AEX, CA2WEX, CW2AEX, i CW2WEX) używać stałym rozmiarze buforu statyczny do przechowywania wynik konwersji.Jeśli wynik jest za duży, aby zmieścić w buforze statycznych, klasa przydziela przy użyciu pamięci malloc, zwalniania pamięci, gdy obiekt wykracza poza zakres.Dzięki temu, w odróżnieniu od starszych makra konwersji tekstu klasy te są bezpieczne do użycia w pętli, a nie przepełnienie stosu.
Wprowadzone w wersji 7.0 ATL makra konwersji są optymalizowane zwrócić uwagę dane wejściowe NULL ciągi.Te makra zostanie zwrócona NULL Jeśli parametr wejściowy jest NULL bez przydziału wszystkie pamięci.
Domyślnie klasy konwersji ATL i makra użyje strony kodowej ANSI bieżącego wątku do konwersji.Jeśli chcesz zmienić to zachowanie dla określonej konwersji przy użyciu makra w zależności od klasy CA2WEX lub CW2AEX, określ strony kodowej jako drugi parametr do konstruktora klasy.
![]() |
---|
Sprawdź długość ciągów przed przekazaniem ich do te makra, aby uniknąć potencjalnych problemów przepełnienie buforu.Przepełnienia stosu są wyjątki, które można również podlegać z spróbuj / z wyjątkiem. |
Istnieje kilka ważnych różnic między starsze makra konwersji ciągu i nowych klas konwersji ciągu:
Stary ATL 3.0 konwersji makra |
Nowe klasy 7.0 konwersji ATL |
---|---|
Przydziela pamięć na stosie. |
Używa stosu pamięci dla małych ciągów.Używa stosu, jeśli stos nie jest wystarczająco duży. |
Ten ciąg jest zwalniane, gdy funkcja jest został zakończony. |
Ten ciąg jest zwalniane, gdy zmienna wykracza poza zakres. |
Nie można używać w mechanizmy obsługi wyjątków. |
Mogą być używane w mechanizmy obsługi wyjątków. |
Nie nadaje się do użycia w pętli.Użycie pamięci zwiększania rozmiaru, dopóki nie zostanie zakończone funkcji. |
Obsługuje stosowanie w pętli.Zakres pętli zapewnia, że pamięć jest zwalniane w każdej iteracji. |
Nie jest dobra dla dużych ciągów.Obszar stosu jest ograniczona. |
Nie problemów z dużych ciągów.Ciągi będą przydzielonych na stosu. |
Zwykle wymagają USES_CONVERSION ma zostać zdefiniowana. |
Nigdy nie wymagają USES_CONVERSION ma zostać zdefiniowana. |
Znaczenie OLE zależy od definicji OLE2ANSI. |
OLE zawsze jest odpowiednikiem W. |
Przykład
Kod
//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);
}
Ostrzeżenie dotyczące wystąpień klas tymczasowy
Należy podkreślić, że następujące nie jest dobra kodu:
LPCTSTR szr = CA2T(szReplaceFile);
Za pomocą makra ATL 3.0, jest dopuszczalne do użycia:
LPCTSTR szr = A2T(szReplaceFile);
ponieważ nie będzie można zwolnić pamięci przydzielonej przez funkcje konwersji, aż do funkcji current zostało zakończone.Ten sam kod nie działa z nowych klas.
Ten kod:
LPCTSTR szr = CA2T(szReplaceFile);
jest równoważne temu:
LPCTSTR szr;
{
CA2T temp(szReplaceFile);
szr = temp.operator LPTSTR();
}
Zgodnie z pamięci przydzielone przez obiekt tymczasowe i zwrócone przez operatora rzutowania jest niszczony, kiedy tymczasowe obiektu, przy użyciu wartości w szr ma niepożądanych wyników.
Zamiast tego należy użyć tego kodu:
CA2T szr(szReplaceFile);
Operator rzutowania sprawia, że obiekt CA2T wyglądać w ten sposób LPCTSTR.
Użycie zaawansowane
Domyślny rozmiar buforu statycznych jest 128 znaków.Jeśli należy zmienić rozmiar bufora dla określonej konwersji, użyj wersji EX makra i określ rozmiar buforu jako argumentu szablonu.
// Example 4
// Changing the size of the buffer.
void ExampleFunction4(LPCWSTR pszW)
{
// Use a 16-character buffer.
ExampleFunctionA(CW2AEX<16>(pszW));
}
Oto przykład określenia strony kodowej jako drugi parametr do konstruktora klasy.
// Example 5
// Specifying the code page.
void ExampleFunction5(LPCWSTR pszW)
{
// Convert to the Macintosh code page
ExampleFunctionA(CW2A(pszW, CP_MACCP));
}
ATL ciąg 3.0 konwersji makra
Oryginalny tekst makra konwersji są nadal dostępne i przedstawiono w poniższej tabeli:
ATL ciąg 3.0 konwersji makra
A2BSTR |
OLE2A |
T2A |
W2A |
A2COLE |
OLE2BSTR |
T2BSTR |
W2BSTR |
A2CT |
OLE2CA |
T2CA (Przestarzałe.Użyj T2CA_EX lub CT2CA zamiast.) |
W2CA |
A2CW |
OLE2CT |
T2COLE |
W2COLE |
A2OLE |
OLE2CW |
T2CW |
W2CT |
A2T |
OLE2T |
T2OLE |
W2OLE |
A2W |
OLE2W |
T2W |
W2T |
Składnia przy użyciu tych makra jest w następujący sposób:
MACRONAME( string_address )
Na przykład:
A2W(lpa);
W nazwach makra typu ciąg źródłowy jest po lewej stronie (na przykład A) i typu ciąg docelowy jest po prawej stronie (na przykład W).A oznacza LPSTR, OLE oznacza LPOLESTR, T oznacza LPTSTR, i W oznacza LPWSTR.
Jeśli C w nazwie makra konwertuje makra const ciągu.Na przykład W2CA konwertuje LPWSTR do LPCSTR.
W związku z tym A2W konwertuje LPSTR do LPWSTR, OLE2T konwertuje LPOLESTR do LPTSTR, i tak dalej.
Zachowanie makra konwersji ciągu ATL zależy od dyrektywy kompilatora w rezultacie, jeśli występuje.Jeśli typy źródłowy i docelowy są takie same, odbywa się bez konwersji.Zmiana dyrektywy kompilatora T i OLE w następujący sposób:
Dyrektywa kompilatora w obiekcie |
T staje się |
OLE staje się |
---|---|---|
Brak |
A |
W |
_UNICODE |
W |
W |
OLE2ANSI |
A |
A |
_UNICODE i OLE2ANSI |
W |
A |
Ciąg docelowy jest tworzony za pomocą _alloca, z wyjątkiem przypadku, gdy typ docelowy jest BSTR.Przy użyciu _alloca przydziela pamięci stosu, tak aby po powrocie z funkcji jest automatycznie wyczyścić.Domyślnie ta makra tylko przekonwertuje do 500KB w tym samym czasie.
Przy użyciu makra konwersji ciągu ATL, określić USES_CONVERSION makra na początku funkcji w celu uniknięcia błędów kompilatora.Na przykład:
void StringFunc(LPSTR lpsz)
{
USES_CONVERSION;
LPWSTR x = A2W(lpsz);
// Do something with x
wprintf_s(L"x is %s", x);
}
Wymagania
Plik nagłówka: AtlBase.h, AtlConv.h (zadeklarowane w AtlConv.h)
Zobacz też
Informacje
DEVMODE i makra konwersji ciągu TEXTMETRIC