Aracılığıyla paylaş


CStringT Kullanarak Dize Sınıflarını Dışarı Aktarma

Uyarı

Microsoft Foundation Sınıfları (MFC) kitaplığı ve Etkin Şablon Kitaplığı (ATL) desteklenmeye devam ediyor. Ancak artık özellik eklemeyeceğiz veya belgeleri güncelleştirmeyeceğiz.

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 CString statik 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ştirebilirsiniz CString .

  • 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ı CString aktarır. Kendisi bir şablon sınıfı olduğundan CString , derleyici dll'den içeri aktarıldığının farkında CString olmadığı 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ı CString nedeniyle çarpma tanımlı CString bir 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 CStringbir karışımını CMyString kullanır. "MyString.h" önceden derlenmiş üst bilgide yer almaz ve bazı kullanımları CString görünür değildir CMyString .

ve CString sınıflarını CMyString 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 CStringA (ve gerekli temel sınıfları) MFC90.DLL dışarı aktarınCStringW. MFC içeren projeler, önceki MFC uygulamalarında olduğu gibi her zaman ve CStringAdışarı aktarılan CStringW MFC DLL'sini kullanır.

Ardından aşağıdaki gibi CStringT şablonu kullanarak CStringT_Exported 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 CStringT bir sınıfı dışarı CStringT aktarmasına neden olacağı için kendisini dışarı aktarmamalısınız.

  • öğesinden dışarı aktarılabilir türetilmiş bir sınıfın CStringT kullanılması, işlevselliği yeniden uygulamak CStringT zorunda olmayı en aza indirir. Ek kod, oluşturucuların temel sınıfa iletilmesiyle CStringT sınırlıdır.

  • CString, CStringAve CStringW yalnı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'lerinin CStringiç kullanımı da dışarı aktarılmış olarak işaretlenirCStringA.CStringWCString

CStringT Sınıfı

Ayrıca bkz.

CStringT kullanma
CString Kullanma