CStringT를 사용하여 문자열 클래스 내보내기

과거에는 MFC 개발자가 자체 문자열 클래스를 특수화하기 위해 파생되었습니다 CString . Microsoft Visual C++.NET(MFC 8.0)에서 CString 클래스는 CStringT라는 템플릿 클래스로 대체되었습니다. 이렇게 하면 다음과 같은 몇 가지 이점이 제공되었습니다.

  • 이를 통해 더 큰 MFC CString 정적 라이브러리 또는 DLL에 연결하지 않고 ATL 프로젝트에서 MFC 클래스를 사용할 수 있습니다.

  • CStringT 템플릿 클래스를 사용하면 C++ 표준 라이브러리의 템플릿과 유사하게 문자 특성을 지정하는 템플릿 매개 변수를 사용하여 동작을 사용자 지정할 CString 수 있습니다.

  • 를 사용하여 CStringTDLL에서 고유한 문자열 클래스를 내보내면 컴파일러도 기본 클래스를 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
};

소비자 코드는 다음을 CStringCMyString혼합하여 사용합니다. "MyString.h"는 미리 컴파일된 헤더에 포함되지 않으며 일부 사용법 CStringCMyString 표시되지 않습니다.

별도의 소스 파일인 CString Source1.cpp 및 CMyString Source2.cpp에서 클래스와 클래스를 사용한다고 가정합니다. 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에서 이전 CStringCStringACStringW 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, CStringAMFC CStringW 공유 DLL을 사용하여 빌드할 때만 표시 __declspec(dllexport/dllimport) 되어야 합니다. MFC 정적 라이브러리와 연결하는 경우 이러한 클래스를 내보낸 것으로 표시해서는 안 됩니다. 그렇지 않으면 내부 사용 CString, CStringACStringW 내부 사용자 DLL도 내보낸 것으로 표시됩니다 CString .

CStringT 클래스

참고 항목

CStringT 사용
CString 사용