Udostępnij za pośrednictwem


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ń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

87zae4a3.collapse_all(pl-pl,VS.110).gifKod

//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(pl-pl,VS.110).gifOstrzeż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.

87zae4a3.collapse_all(pl-pl,VS.110).gifZaawansowane 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);
}

87zae4a3.collapse_all(pl-pl,VS.110).gifWymagania

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