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.