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ştirebilirsinizCString
.kullanarak
CStringT
bir 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ğundanCString
, derleyici dll'den içeri aktarıldığının farkındaCString
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 CString
sı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 CMyString
bir 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 CString
ancak MyString.h #include. Bu durumda bağlayıcı, çarpım tanımlandığından şikayet CStringT
eder. Bunun nedeni CString
hem öğesini dışarı CMyString
aktaran 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 CStringW
dış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
, CStringA
ve 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 uygulamakCStringT
zorunda olmayı en aza indirir. Ek kod, oluşturucuların temel sınıfa iletilmesiyleCStringT
sınırlıdır.CString
,CStringA
veCStringW
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'lerininCString
iç kullanımı da dışarı aktarılmış olarak işaretlenirCString
.CStringW
CStringA
İlgili Konular'a
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin