Exportação de classes de string usando CStringT

No passado, os desenvolvedores MFC têm derivado de CString para se especializar suas próprias classes de seqüência de caracteres. No Microsoft Visual C++ .NET (MFC 8.0), a CString classe foi substituída por uma classe de modelo chamada CStringT.Isso proporcionou vários benefícios:

  • Ele permitiu o MFC CString classe a ser usado na ATL projetos sem criar links na biblioteca estática do MFC ou DLL maiores.

  • Com o novo CStringT classe de modelo, você pode personalizar CString comportamento usando os parâmetros de modelo que especificar características de caractere, como os modelos de STL (Standard Template biblioteca).

  • Ao exportar sua própria classe de seqüência de caracteres de uma DLL usando CStringT, o compilador automaticamente exporta o CString classe base. Desde CString é uma classe de modelo pode ser instanciada pelo compilador quando usado, a menos que o compilador está ciente de que CString é importado de uma DLL. Se você migrou projetos do Visual C++ 6.0 para Visual C++. NET, você pode ter visto vinculador símbolo erros para um definido multiplicar CString Por causa de colisão da CString importado de uma DLL e a versão localmente instanciada. O modo adequado para fazer isso é descrito abaixo.Para obter mais informações sobre esse problema, consulte o artigo do base de dados de conhecimento, "vinculação erros quando você importa derivado de CString classes" (Q309801) no CD-ROM Biblioteca MSDN ou emhttp://suporte.Microsoft.com/padrão.aspx.

O cenário a seguir fará com que o vinculador a produzir erros de símbolo para classes definidas multiplicar.Suponha que você estiver exportando um CString-(classe derivadaCMyString) uma DLL de extensão do MFC:

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

O código do consumidor usa uma mistura de CString e CMyString. "MyString.h"não está incluído no cabeçalho pré-compilado e alguns utilização deCString não é necessário CMyString visível.

Suponha que você use o CString e CMyString classes em arquivos de fonte separado, Source1.cpp e Source2.cpp. Source1.cpp, você usar CMyString e # include MyString.h. Source2.cpp, você usar CString, mas não # incluem MyString.h. Nesse caso, o vinculador reclamará sobre CStringT Multiplique sendo definido. Isso é causado por CString ambos importado da DLL que exporta CMyStringe instanciada localmente pelo compilador por meio do CStringT modelo.

Para resolver esse problema, faça o seguinte:

Exportar CStringA e CStringW (e as classes base necessárias) de MFC90.DLL. Projetos que incluem MFC sempre usará a DLL da MFC exportado CStringA e CStringW, sistema autônomo sistema autônomo implementações anteriores do MFC.

Em seguida, crie uma classe derivada podem ser exportada usando o CStringT modelo, sistema autônomo CStringT_Exported é abaixo, por exemplo:

#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
};

No AfxStr.h, substitua a anterior CString, CStringA, e CStringW Typedefs da seguinte maneira:

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

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

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

Existem várias advertências:

  • Você não deve exportar CStringT si porque isso causará projetos ATL somente para exportar um especializados CStringT classe.

  • Usando uma classe derivada exportável de CStringT minimiza a necessidade de reimplementar a CStringT funcionalidade. Código adicional é limitado a encaminhar construtores para o CStringT classe base.

  • CString, CStringA, e CStringW só deve ser marcado __declspec(dllexport/dllimport) Quando você está criando com um MFC compartilhada DLL. Se a vinculação com uma biblioteca estática MFC, você não deve marcar essas classes sistema autônomo exportado; caso contrário, o uso interno de CString, CStringA, e CStringW dentro de DLLs do usuário irá marcar CString sistema autônomo também exportado.

Tópicos relacionados

Classe CStringT

Consulte também

Outros recursos

Usando CStringT

Usando CString