Udostępnij za pośrednictwem


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.

Informacje dotyczące przestrogiPrzestroga

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.

Uwaga dotycząca zabezpieczeńUwaga dotycząca zabezpieczeń

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

Inne zasoby

Makra ATL