Поделиться через


Экспортирование классов строки с помощью CStringT

В прошлом, разработчики MFC, производного от CString для специализировать собственные классы строки.В Microsoft Visual C++ .NET 8,0 (MFC), класс CString был заменен классом шаблона CStringT вызова.Это ожидания несколько преимуществ:

  • Это позволить класс MFC CString для использования в проектах библиотеки ATL, не связывая в более крупной или статической библиотеке DLL MFC.

  • С новым классом шаблона CStringT, можно настраивать функциональности CString использование параметров шаблона символов, подобные признаки, которые определяют к шаблонам в стандартной библиотеки шаблонов (STL).

  • При экспорте собственный класс строки из библиотеки DLL с помощью CStringT компилятор также автоматически экспортирует базовый класс CString.Поскольку CString является классом шаблона, он может быть создан компилятором при использовании если компилятор не узнает об импортироватьо, что CString из библиотеки DLL.Если перенесенных проектов, созданных в Visual C++ 6,0 в Visual C++ .NET, можно увидеть ошибки компоновщика умножать- символов для заданного CString из-за конфликта CString импортированного из библиотеки DLL и локально создавать версии.Правильный способ это сделать - описан ниже.Дополнительные сведения об этом этой проблеме см. в статье базы знаний Майкрософт "связывание ошибки при импорте CString- производные классы" (Q309801) на компакт-диске библиотеки MSDN или на https://support.microsoft.com/default.aspx.

Следующий сценарий создает компоновщик возникать ошибки символов для умножает определенные классы.Предположим, что необходимо экспортировать CString- производный класс (CMyString) из библиотеки DLL расширения MFC:

// MyString.h
class AFX_EXT_CLASS CMyString : public CString
{
   // Your implementation code
};

Код объекта-получателя используется смесь CString и CMyString. "MyString.h" не включается в предварительно скомпилированного заголовка и некоторое потребление CString не имеет CMyString видимый.

Предположим, что необходимо использовать классы CString и CMyString в отдельных исходных файлов, Source1.cpp и Source2.cpp.В Source1.cpp используется CMyString и #include MyString.h.В Source2.cpp используется CString, но не сделать #include MyString.h.В этом случае компоновщик пожалуется о CStringT быть умножает заданный.Это вызвано CString и импортирована из библиотеки DLL, которая экспортирует CMyString и создается локально компилятором с помощью шаблона CStringT.

Чтобы разрешить эту проблему, выполните следующие действия:

Экспортировать CStringA и CStringW (и необходимые базовые классы) из MFC90.DLL.Проекты, которые включают MFC всегда будут использовать MFC CStringA, экспортированный библиотеки DLL и CStringW, как в предыдущих реализациях MFC.

Затем создайте экспортируемые производный класс, используя шаблон 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 и typedef CStringW следующим образом:

typedef CStringT_Exported< wchar_t, 
      StrTraitMFC< wchar_t > > CStringW;

typedef CStringT_Exported< char,
      StrTraitMFC< char > > CStringA;

typedef CStringT_Exported< TCHAR,
      StrTraitMFC< TCHAR > > CString;

Несколько предостережений:

  • Не следует экспортировать CStringT самого поскольку это приведет к проекты Библиотеки ATL - только экспортировать специализированный класс CStringT.

  • Использование экспортируемые производный класс от CStringT свернуть CStringT реализуют функциональность re-.Дополнительный код ограничена переадресованы конструкторы к базовому классу CStringT.

  • CString, CStringA и CStringW должны быть помечен как __declspec(dllexport/dllimport) при построении с dll-библиотекой MFC для совместного использования.При статической компоновке с библиотекой MFC не следует пометить эти классы экспортироватьо; в противном случае – CString для внутреннего использования, CStringA и CStringW в библиотеке DLL пользователя помечает CString как экспортироватьо.

Связанные разделы

Класс CStringT

См. также

Другие ресурсы

Использование CStringT

Использование CString