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 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
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);
}
Geç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.
Geliş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);
}
Gereksinimler
Ü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