ATL i MFC ciąg konwersja makr
Makra konwersji ciągu omawiane są ważne dla ATL i MFC.Więcej informacji dotyczących konwersji ciągu MFC, zobacz TN059: przy użyciu makra konwersja MBCS/Unicode MFC i makr MFC i Globals.
ATL 7.0 ciąg klas konwersji i makra
ATL 3.0 String konwersja makr
ATL 7.0 ciąg klas konwersji i makra
ATL 7.0 wprowadzono kilka nowych klas konwersji i makr, zapewniając znaczące ulepszenia przez istniejącego makra.
Nazwy makr i nowych klas konwersji ciągu formę:
CSourceType2CDestinationTypeEX
w przypadku gdy:
SourceType i DestinationType są opisane w poniższej tabeli.
c jest obecna, gdy typ docelowy musi być stała.
EX jest obecna, gdy początkowy rozmiar buforu musi być określona jako argument szablonu.
SourceType/DestinationType
Opis
A
Ciąg znaków ANSI.
W
Ciąg znaków Unicode.
T
Ciąg znaków rodzajowe (odpowiednik w po _UNICODE jest zdefiniowana, równoważne inaczej).
OLE
Ciąg znaków OLE (odpowiednik Sz).
Na przykład, aby przekonwertować ciągu Unicode na ciąg rodzajowy bez zmieniania przekonwertowanej ciąg, należy użyć CW2CT.
Jeśli wiadomo, że przekonwertowany ciąg jest mało prawdopodobne, aby więcej niż 64 znaki, EX wersji, takich jak CW2CTEX <64>, można zaoszczędzić miejsce na stosie.
[!UWAGA]
Konwertowanie z ciągów znaków typu BSTR i zalecanym sposobem jest użycie CComBSTR klasy.Aby przekonwertować typu BSTR, przekazać istniejący ciąg do konstruktora CComBSTR. Aby konwertować z typu BSTR, użyj COLE2cDestinationTypeEX, takich jak COLE2T.
Nowe klasy konwersji, które wymagają bufora (CA2AEX, CA2WEX, CW2AEX, i CW2WEX) używać ustalony rozmiar buforu statycznych do przechowania wyniku konwersji.Jeśli wynik jest za duży do buforu statycznych, przydziela pamięci za pomocą klasy malloc, zwalniania pamięci, gdy obiekt wykracza poza zakres.Zapewnia to, że w przeciwieństwie do starszych makra konwersji tekstu tych klas są bezpieczne w pętli i nie będzie przepełnienia stosu.
Konwersja makra wprowadzone w wersji 7.0 ATL są zoptymalizowane należy zwrócić uwagę wprowadzania NULL ciągów.Te makra zwróci NULL , jeśli parametr wejściowy jest NULL bez konieczności przydzielania pamięci.
Domyślnie klasy ATL konwersji i makra będzie używać strony kodowej ANSI bieżącego wątku 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ślić stronę kodową jako drugi parametr do konstruktora dla klasy.
Uwaga dotycząca zabezpieczeń |
---|
Sprawdź długość ciągów przed przekazaniem ich do tych makr, aby uniknąć potencjalnych problemów przepełnienie buforu.Przepełnienia stosu są wyjątki, które może także podlegać z try / except. |
Istnieje kilka ważnych różnic między makra konwersji ciągu starszych i nowych klas konwersji ciągu:
Stare ATL 3.0 konwersja makr |
Nowe ATL 7.0 klas konwersji |
---|---|
Przydziela pamięć na stosie. |
Używa stosu pamięci dla małych ciągów.Jeśli stos nie jest wystarczająco duży, używa sterty. |
Ciąg jest zwalniana, gdy funkcja jest zakończony. |
Ciąg jest zwalniana, gdy zmienna wykracza poza zakres. |
Nie można procedur obsługi wyjątków. |
Mogą być używane w procedur obsługi wyjątków. |
Nie nadają się do użycia w pętli.Użycie pamięci powiększa się, aż funkcja jest zakończony. |
Obsługuje korzystanie w pętli.Zakres pętli gwarantuje, że pamięć jest zwalniane w każdej iteracji. |
Nie jest dobre dla dużych ciągi.Obszar stosu jest ograniczona. |
Nie ma żadnych problemów z dużych ciągi.Ciągi będą przydzielane na stercie. |
Zwykle wymagają USES_CONVERSION, które zostaną określone. |
Nigdy nie wymagają USES_CONVERSION, które zostaną określone. |
Znaczenie OLE zależy od definicji OLE2ANSI. |
OLE jest zawsze równy 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ąpienia klasy tymczasowe
Należy podkreślić, że następujące nie jest dobry kod:
LPCTSTR szr = CA2T(szReplaceFile);
Za pomocą makra ATL 3.0, był można korzystać:
LPCTSTR szr = A2T(szReplaceFile);
jak pamięci przydzielonej przez funkcje konwersji nie będzie zwolniona dopóki bieżący funkcji został zakończony.Ten sam kod nie działa z nowych klas.
Ten kod:
LPCTSTR szr = CA2T(szReplaceFile);
jest to równoważne:
LPCTSTR szr;
{
CA2T temp(szReplaceFile);
szr = temp.operator LPTSTR();
}
Jak pamięci przydzielonej przez tymczasowy obiekt i zwrócony z operatora rzutowania jest niszczony, kiedy niszczony jest obiekt tymczasowy, używając wartości w szr będzie niepożądane wyniki.
Zamiast tego użyj tego kodu:
CA2T szr(szReplaceFile);
Operatora rzutowania sprawia, że wyglądają jak obiekt CA2T LPCTSTR.
Zaawansowane wykorzystanie
Domyślny rozmiar buforu statyczne wynosi 128 znaków.Jeśli należy zmienić rozmiar buforu dla określonej konwersji, użyj wersji EX makra i określ rozmiar buforu jako argument 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 dla klasy.
// Example 5
// Specifying the code page.
void ExampleFunction5(LPCWSTR pszW)
{
// Convert to the Macintosh code page
ExampleFunctionA(CW2A(pszW, CP_MACCP));
}
ATL 3.0 String konwersja makr
Oryginalnego makra konwersji tekstu są nadal dostępne i są wymienione w poniższej tabeli:
ATL 3.0 String konwersja makr
A2BSTR |
OLE2A |
T2A |
W2A |
A2COLE |
OLE2BSTR |
T2BSTR |
W2BSTR |
A2CT |
OLE2CA |
T2CA (przestarzałe.Use T2CA_EX or CT2CA instead.) |
W2CA |
A2CW |
OLE2CT |
T2COLE |
W2COLE |
A2OLE |
OLE2CW |
T2CW |
W2CT |
A2T |
OLE2T |
T2OLE |
W2OLE |
A2W |
OLE2W |
MODUŁ T2W |
W2T |
Przy użyciu tych makr składnia jest następująca:
MACRONAME( string_address )
Na przykład:
A2W(lpa);
W nazwach makr typu ciąg źródłowy jest po lewej stronie (na przykład a) i typu ciąg docelowego jest po prawej stronie (na przykład w).A stands for LPSTR, OLE stands for LPOLESTR, T stands for LPTSTR, and W stands for LPWSTR.
Jeśli jest c Nazwa makra makro konwertuje const ciąg.Na przykład W2CA konwertuje LPWSTR do LPCSTR.
Tak więc A2W konwertuje LPSTR do LPWSTR, OLE2T konwertuje LPOLESTR do LPTSTR, itd.
Zachowanie makra konwersji ciągu ATL zależy od dyrektywy kompilator efektu, jeśli.Jeśli typy źródłowy i docelowy są takie same, odbywa się bez konwersji.Zmiana dyrektyw kompilatora t i OLE następująco:
Kompilator dyrektywy efektu |
Staje się t |
Staje się OLE |
---|---|---|
Brak |
A |
W |
_UNICODE |
W |
W |
OLE2ANSI |
A |
A |
_UNICODE i OLE2ANSI |
W |
A |
Ciąg docelowego jest tworzony przy użyciu _alloca, z wyjątkiem przypadków, gdy typ docelowy jest BSTR.Za pomocą _alloca przydziela pamięci stosu, tak aby po powrocie z funkcji są automatycznie czyszczone.Domyślnie to makro będzie konwertować tylko do 500 KB na raz.
Określić, używając makra konwersji ciągu ATL USES_CONVERSION makra na początku funkcji w celu uniknięcia błędy 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