Aracılığıyla paylaş


atl ve mfc dize dönüştürme makrolar

Burada tartışılan dönüştürme macros dizesi, atl ve mfc için geçerlidir.mfc dize dönüştürme hakkında daha fazla bilgi için bkz: TN059: mfc mbcs/Unicode dönüşümü makroları kullanarak ve mfc makrolar ve Globals.

  • atl 7.0 dize dönüştürme sınıfları ve makrolar

  • atl 3.0 dize makroları dönüştürme

atl 7.0 dize dönüştürme sınıfları ve makrolar

atl 7.0 varolan makroları önemli gelişmeler sağlayan birkaç yeni dönüştürme sınıflar ve makrolar, tanıtır.

Yeni dize dönüştürme sınıflar ve makro adları formu alın:

CSourceType2CDestinationTypeEX

Burada:

  • Kaynak türü ve DestinationType aşağıdaki tabloda açıklanmıştır.

  • c ne zaman hedef türü olmalıdır sabit Bugünü değil.

  • ex ne zaman ilk arabellek boyutu belirtilmelidir şablon bağımsız değişken olarak var olur.

    Kaynak türü/DestinationType

    Description

    A

    ANSI karakter dizesi.

    W

    Unicode karakter dizesi.

    T

    Genel karakter dizesi (_UNICODE tanımlanan, eşdeğer bir başka türlü olduğunda W'e denktir).

    OLE

    ole karakter dizesi (W'e denktir).

Örneğin, içinden bir Unicode dizesi dönüştürülmüş dize değiştirmeden genel bir dizeye dönüştürmek için kullanın CW2CT.

Dönüştürülen dize 64 karakterden daha uzun, olabilirler biliniyorsa ex sürümü, gibi CW2CTEX <64>, yığında yer kazanmak için kullanılır.

[!NOT]

Gelen bstr dizeleri ve dönüştürme önerilen yolu CComBSTR sınıfı.Varolan bir dizeyi bir bstr dönüştürmek için kurucusuna aktarmalısınız CComBSTR. bstr dönüştürmek için COLE2cDestinationTypeex, aþaðýdaki gibi COLE2T.

Arabellek gerektiren yeni dönüştürme sınıflar (CA2AEX, CA2WEX, CW2AEX, ve CW2WEX) statik sabit boyutlu arabellek Dönüþümün sonucu depolamak için kullanın.Sonucu statik arabelleğine sığmayacak kadar büyük ise, sınıf kullanarak bellek ayırır malloc, nesne kapsam dışına çıktığında bellek boşaltma.Bu eski metin dönüştürme makroları aksine bu sınıfların döngüleri içinde kullanımı güvenlidir ve yığın taşması kalmaz, sağlar.

atl 7. 0'da tanıtılan dönüştürme makroları giriş verileri haberdar olmanız için optimize edilmiştir null dizeleri.Bu makroları döner null girdi parametresi ise null herhangi bir bellek ayırma olmadan.

Varsayılan olarak, atl dönüştürme sınıfları ve makroları geçerli iş parçacığının ANSI kod sayfası dönüştürme için kullanır.Sınıflara dayanan makroları kullanarak özel bir dönüştürmenin bu davranışı geçersiz kılmak istiyorsanız, CA2WEX veya CW2AEX, sınıfının kurucusuna ikinci parametre olarak kod sayfasını belirtin.

Güvenlik NotuGüvenlik Notu

Olası Arabellek Taşması sorunları önlemek için bu makrolar geçirmeden önce dizelerin uzunluğunu denetleyin.Yığını taşmaları de biryöntem try / dışında özel durumlar şunlardır.

Eski dize dönüştürme makrolar ve yeni dize dönüştürme sınıflar arasında bazı önemli farklar vardır:

Eski atl 3.0 makroları dönüştürme

Yeni atl 7.0 dönüştürme sınıfları

Yığın bellek ayırır.

Kullandığı küçük dizeleri için bellek yığını.Yığın yeterince büyük değilse, öbek kullanır.

Dize işlevi çıkıldığı zaman serbest kalır.

Dize değişkeni kapsam dışına çıktığında serbest kalır.

Özel durum işleyicilerini kullanılamaz.

Özel durum işleyicileri kullanılır.

Döngüleri kullanmak için uygun değil.Bellek kullanımını işlevi çıkılıncaya kadar büyür.

Destekler in döngüleri kullanın.Döngü kapsamı sağlar belleğin her yinelenişinde serbest kalır.

Büyük veri dizeleri için iyi değildir.Yığın alanı sınırlıdır.

Büyük veri dizeleri ile sorun yok.Dizeleri öbek üzerinde tahsis edilebilir.

Genellikle USES_CONVERSION tanımlanmış olması gerekir.

Tanımlanması USES_CONVERSION gerek duymazlar.

ole anlamını OLE2ANSI tanımına dayanan bağlıdır.

ole her zaman için w. eşdeğerdir

Örnek

87zae4a3.collapse_all(tr-tr,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(tr-tr,VS.110).gifGeçici sınıf örneği ile ilgili bir uyarı

Kullanımı, aşağıdaki iyi kodu değil, yoğun:

LPCTSTR szr = CA2T(szReplaceFile);

atl 3.0 makrolarını kullanarak, kullanmak için kabul edilebilir:

LPCTSTR szr = A2T(szReplaceFile);   

Geçerli işlevin çıkıldı kadar dönüştürme işlevleri tarafından ayrılan bellek serbest değil gibi.Aynı kod, yeni sınıflar ile çalışmaz.

Bu kodu:

LPCTSTR szr = CA2T(szReplaceFile);   

şuna eşdeğerdir:

LPCTSTR szr;
{
   CA2T temp(szReplaceFile);
   szr = temp.operator LPTSTR();
}   

Geçici nesnesi yok edildiğinde geçici bir nesne tarafından ayrılan ve cast operatörden döndürülen bellek görmesi gibi değeri kullanarak szr istenmeyen sonuçlara yol açabilir.

Bunun yerine, bu kodu kullanın:

CA2T szr(szReplaceFile);   

Neye CA2T nesne Atama işlecinin yaptığı bir LPCTSTR.

87zae4a3.collapse_all(tr-tr,VS.110).gifGelişmiş kullanım

Varsayılan statik arabellek boyutu 128 karakter olabilir.Arabellek boyutu için özel bir dönüştürmenin değiştirilmesi gerekirse, bir makro ex sürümünü kullanmalı ve şablon bağımsız değişken olarak arabellek boyutu belirtin.

// Example 4
// Changing the size of the buffer.
void ExampleFunction4(LPCWSTR pszW)
{
   // Use a 16-character buffer.
   ExampleFunctionA(CW2AEX<16>(pszW));
}

İşte bir örnek kod sayfası sınıfının kurucusuna ikinci parametre olarak belirtme.

// Example 5
// Specifying the code page.
void ExampleFunction5(LPCWSTR pszW)
{
   // Convert to the Macintosh code page
   ExampleFunctionA(CW2A(pszW, CP_MACCP));
}

atl 3.0 dize makroları dönüştürme

Özgün metin dönüştürme makroları kullanılabilir durumdadır ve aşağıdaki tabloda listelenmiştir:

atl 3.0 dize makroları dönüştürme

A2BSTR

OLE2A

T2A

W2A

A2COLE

OLE2BSTR

T2BSTR

W2BSTR

A2CT

OLE2CA

T2CA (kullanım dışı.Use T2CA_EX or CT2CA instead.)

W2CA

A2CW

OLE2CT

T2COLE

W2COLE

A2OLE

OLE2CW

T2CW

W2CT

A2T

OLE2T

T2OLE

W2OLE

A2W

OLE2W

T2W

W2T

Bu makroları kullanmak için sözdizimi aşağıdaki gibidir:

MACRONAME( string_address )

Örne?in:

A2W(lpa);

Makro adları, kaynak dizesi solda türüdür (örneğin, a) ve sağdaki hedef dize türü olan (örneğin, w).A stands for LPSTR, OLE stands for LPOLESTR, T stands for LPTSTR, and W stands for LPWSTR.

Yoksa bir c makro adını makroyu dönüştürür bir const dize.Örneğin, W2CA dönüştüren bir LPWSTR için bir LPCSTR.

Bu nedenle, A2W dönüştüren bir lpstr için bir LPWSTR, OLE2T dönüştüren bir LPOLESTR için bir LPTSTRve benzeri.

atl dize dönüştürme makroları davranışını etkisi, derleyici yönergesinde varsa bağlıdır.Kaynak ve hedef türleri aynı ise, dönüştürme işlemi gerçekleştirilir.Derleyici yönergeleri değiştirmek t ve ole aşağıdaki gibi:

Derleyici yönergesinde efekti

T olur

ole olur

None

A

W

_UNICODE

W

W

OLE2ANSI

A

A

_UNICODE ve OLE2ANSI

W

A

Hedef dize _ kullanılarak oluşturulanalloca, hedef türü olduğunda dışında BSTR.Kullanarak _alloca işlevinizde döndüğünde onu otomatik olarak temizlenir, kapalı yığın bellek ayırır.Varsayılan olarak bu makroyu yalnızca en fazla 500 kb anda dönüştürecektir.

atl dize dönüştürme makro kullanırken belirtmeniz USES_CONVERSION derleyici hataları önlemek için işlevinin başında makro.Örne?in:

void StringFunc(LPSTR lpsz)
{
   USES_CONVERSION;

   LPWSTR x = A2W(lpsz);
   // Do something with x
   wprintf_s(L"x is %s", x);
}

87zae4a3.collapse_all(tr-tr,VS.110).gifGereksinimler

Üstbilgi dosyası: AtlBase.h, AtlConv.h (AtlConv.h içinde bildirilen)

Ayrıca bkz.

Başvuru

devmode ve TEXTMETRIC dize dönüştürme makrolar

Diğer Kaynaklar

ATL Makroları