Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Geçmişte MFC geliştiricileri kendi dize sınıflarını özelleştirmek için 'den CString türetilmiştir. Microsoft Visual C++.NET'te (MFC 8.0), CString sınıfının yerini CStringT adlı bir şablon sınıfı alır. Bu, çeşitli avantajlar sağladı:
MFC sınıfının daha büyük MFC
CStringstatik kitaplığında veya DLL'sinde bağlanmadan ATL projelerinde kullanılmasına izin verdi.Yeni
CStringTşablon sınıfıyla, C++ Standart Kitaplığı'ndaki şablonlara benzer şekilde karakter özelliklerini belirten şablon parametrelerini kullanarak davranışı özelleştirebilirsinizCString.kullanarak
CStringTbir DLL'den kendi dize sınıfınızı dışarı aktardığınızda, derleyici de otomatik olarak temel sınıfı dışarıCStringaktarır. Kendisi bir şablon sınıfı olduğundanCString, derleyici dll'den içeri aktarıldığının farkındaCStringolmadığı sürece kullanıldığında derleyici tarafından örneklenebilir. Projeleri Visual C++ 6.0'dan Visual C++.NET'e geçirdiyseniz, DLL'den içeri aktarılan ve yerel olarak örneklenen sürümün çakışmasıCStringnedeniyle çarpma tanımlıCStringbir bağlantı simgesi hataları görmüş olabilirsiniz. Bunu yapmak için uygun yol aşağıda açıklanmıştır.
Aşağıdaki senaryo bağlayıcının çarpma tanımlı sınıflar için sembol hataları üretmesine neden olur. MFC uzantısı DLL'sinden türetilmiş bir CStringsınıfı (CMyString) dışarı aktardığınız varsayılır:
// MyString.h
class AFX_EXT_CLASS CMyString : public CString
{
// Your implementation code
};
Tüketici kodu ve'nin CMyStringbir karışımını CString kullanır. "MyString.h" önceden derlenmiş üst bilgide yer almaz ve bazı kullanımları CString görünür değildir CMyString .
ve CMyString sınıflarını CString Source1.cpp ve Source2.cpp ayrı kaynak dosyalarda kullandığınızı varsayalım. Source1.cpp'da MyString.h dosyasını kullanır CMyString ve #include. Source2.cpp'da kullanırsınız CStringancak MyString.h #include. Bu durumda bağlayıcı, çarpım tanımlandığından şikayet CStringT eder. Bunun nedeni CString hem öğesini dışarı CMyStringaktaran DLL'den içeri aktarılması hem de şablon aracılığıyla derleyici tarafından yerel olarak örneği oluşturmasıdır CStringT .
Bu sorunu çözmek için aşağıdakileri yapın:
ve CStringW (ve gerekli temel sınıfları) MFC90.DLL dışarı aktarınCStringA. MFC içeren projeler, önceki MFC uygulamalarında olduğu gibi her zaman ve CStringWdışarı aktarılan CStringA MFC DLL'sini kullanır.
Ardından aşağıdaki gibi CStringT_Exported şablonu kullanarak CStringT dışarı aktarılabilir türetilmiş bir sınıf oluşturun, örneğin:
#ifdef _AFXDLL
#define AFX_EXT_CSTRING AFX_EXT_CLASS
#else
#define AFX_EXT_CSTRING
#endif
template< typename BaseType, class StringTraits >
class AFX_EXT_CSTRING CStringT_Exported
: public CStringT< BaseType, StringTraits >
{
// Reimplement all CStringT<> constructors and
// forward to the base class implementation
};
AfxStr.h dosyasında, önceki CString, CStringAve CStringW typedefs değerlerini aşağıdaki gibi değiştirin:
typedef CStringT_Exported< wchar_t,
StrTraitMFC< wchar_t > > CStringW;
typedef CStringT_Exported< char,
StrTraitMFC< char > > CStringA;
typedef CStringT_Exported< TCHAR,
StrTraitMFC< TCHAR > > CString;
Birkaç uyarı vardır:
Yalnızca ATL projelerinin özel
CStringTbir sınıfı dışarıCStringTaktarmasına neden olacağı için kendisini dışarı aktarmamalısınız.öğesinden dışarı aktarılabilir türetilmiş bir sınıfın
CStringTkullanılması, işlevselliği yeniden uygulamakCStringTzorunda olmayı en aza indirir. Ek kod, oluşturucuların temel sınıfa iletilmesiyleCStringTsınırlıdır.CString,CStringAveCStringWyalnızca MFC paylaşılan DLL ile oluştururken işaretlenmelidir__declspec(dllexport/dllimport). MFC statik kitaplığıyla bağlantı oluşturuyorsanız, bu sınıfları dışarı aktarılmış olarak işaretlememelisiniz; aksi takdirde, , ve kullanıcı DLL'lerininCStringiç kullanımı da dışarı aktarılmış olarak işaretlenirCString.CStringWCStringA