Share via


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

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 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 dosyalarında kullandığınızı varsayalım. Source1.cpp dosyasında MyString.h dosyasını kullanır CMyString ve #include. Source2.cpp'de komutunu 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:

CStringW ve (ve gerekli temel sınıfları) MFC90.DLL'den 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 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şaretlenirCString.CStringWCStringA

CStringT Sınıfı

Ayrıca bkz.

CStringT kullanma
CString Kullanma