CStringT를 사용하여 문자열 클래스 내보내기
과거에는 MFC 개발자가 자체 문자열 클래스를 특수화하기 위해 파생되었습니다 CString
. Microsoft Visual C++.NET(MFC 8.0)에서 CString 클래스는 CStringT라는 템플릿 클래스로 대체되었습니다. 이렇게 하면 다음과 같은 몇 가지 이점이 제공되었습니다.
이를 통해 더 큰 MFC
CString
정적 라이브러리 또는 DLL에 연결하지 않고 ATL 프로젝트에서 MFC 클래스를 사용할 수 있습니다.새
CStringT
템플릿 클래스를 사용하면 C++ 표준 라이브러리의 템플릿과 유사하게 문자 특성을 지정하는 템플릿 매개 변수를 사용하여 동작을 사용자 지정할CString
수 있습니다.를 사용하여
CStringT
DLL에서 고유한 문자열 클래스를 내보내면 컴파일러도 기본 클래스를CString
자동으로 내보냅니다.CString
자체 템플릿 클래스이므로 컴파일러가 DLL에서 가져온 것을CString
인식하지 않는 한 사용할 때 컴파일러에서 인스턴스화할 수 있습니다. Visual C++ 6.0에서 Visual C++.NET으로 프로젝트를 마이그레이션한 경우 DLL에서 가져온 것과 로컬로 인스턴스화된 버전이 충돌CString
하여 곱하기 정의CString
에 대한 링커 기호 오류가 표시되었을 수 있습니다. 이 작업을 수행하는 적절한 방법은 아래에 설명되어 있습니다.
다음 시나리오에서는 링커가 곱하기 정의 클래스에 대한 기호 오류를 생성합니다. MFC 확장 DLL에서 파생 클래스(CMyString
)를 내CString
보낸다고 가정합니다.
// MyString.h
class AFX_EXT_CLASS CMyString : public CString
{
// Your implementation code
};
소비자 코드는 다음을 CString
CMyString
혼합하여 사용합니다. "MyString.h"는 미리 컴파일된 헤더에 포함되지 않으며 일부 사용법 CString
은 CMyString
표시되지 않습니다.
Source1.cpp 및 CMyString
Source2.cpp 별도의 소스 파일에서 클래스와 클래스를 사용 CString
한다고 가정합니다. Source1.cpp MyString.h를 사용하고 CMyString
#include. Source2.cpp MyString.h를 사용 CString
하지만 #include 않습니다. 이 경우 링커는 곱하기 정의에 대해 CStringT
불평합니다. 이는 내보내는 DLL에서 가져오고 템플릿을 통해 CStringT
컴파일러에 의해 로컬로 인스턴스화되어 발생 CString
합니다CMyString
.
이 문제를 해결하려면 다음을 수행합니다.
MFC90.DLL 내보내 CStringA
기 및 CStringW
(및 필요한 기본 클래스) MFC를 포함하는 프로젝트는 항상 이전 MFC 구현에서와 CStringW
같이 내보낸 CStringA
MFC DLL을 사용합니다.
그런 다음, 아래와 같이 템플릿을 CStringT
사용하여 내보낼 수 있는 파생 클래스를 만듭니다. 예를 들면 다음과 같습니다 CStringT_Exported
.
#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에서 이전 CString
CStringA
및 CStringW
typedef를 다음과 같이 바꿉니다.
typedef CStringT_Exported< wchar_t,
StrTraitMFC< wchar_t > > CStringW;
typedef CStringT_Exported< char,
StrTraitMFC< char > > CStringA;
typedef CStringT_Exported< TCHAR,
StrTraitMFC< TCHAR > > CString;
다음과 같은 몇 가지 주의 사항이 있습니다.
이렇게 하면 ATL 전용 프로젝트가 특수
CStringT
클래스를 내보내므로 자체 내보내지CStringT
않아야 합니다.내보낼 수 있는 파생 클래스를
CStringT
사용하면 기능을 다시 구현CStringT
할 필요가 최소화됩니다. 추가 코드는 생성자를 기본 클래스로 전달하는 것으로CStringT
제한됩니다.CString
,CStringA
MFCCStringW
공유 DLL을 사용하여 빌드할 때만 표시__declspec(dllexport/dllimport)
되어야 합니다. MFC 정적 라이브러리와 연결하는 경우 이러한 클래스를 내보낸 것으로 표시해서는 안 됩니다. 그렇지 않으면 내부 사용CString
,CStringA
및CStringW
내부 사용자 DLL도 내보낸 것으로 표시됩니다CString
.