Exportando classes de cadeia de caracteres usando CStringT
Em o passado, os desenvolvedores MFC derivada de CString para especializar suas próprias classes de cadeia de caracteres. Em o Microsoft Visual C++ .NET (MFC 8,0), a classe de CString foi substituída por uma classe de modelo chamada CStringT. Isso forneceu vários benefícios:
Permitiu que a classe MFC CString é usada em projetos de ATL sem vincular na biblioteca estático ou maior no DLL MFC.
Com a nova classe de modelo de CStringT , você pode personalizar o comportamento de CString usando os parâmetros de modelo que especificam traços de caractere, semelhantes aos modelos na biblioteca padrão (STL) do modelo.
Quando você exportar sua própria classe de cadeia de caracteres de uma DLL usando CStringT, o compilador também exportar automaticamente a classe base de CString . Desde que CString é também uma classe de modelo, pode ser instanciada pelo compilador quando usado, a menos que o compilador esteja ciente que CString é importado de uma DLL. Se você migrou projetos do Visual C++ 6,0 para Visual C++ .NET, você pode ter consultado erros de símbolo de vinculador para CString multiplicar- definido por causa de colisão de CString importado de uma DLL e versão localmente instanciada. A maneira apropriada de fazer isso é descrita abaixo. Para obter mais informações sobre esse problema, consulte o artigo de Base de Dados de Conhecimento, “vinculando erros quando você importar classes derivadas CString-” (Q309801) na Biblioteca MSDN um CD-ROM https://support.microsoft.com/default.aspxou.
O cenário a seguir causará o vinculador a erros de símbolo de produto para classes definidas em. Suponha que você está exportando CString- classe derivada (CMyString) de uma DLL de extensão MFC:
// MyString.h
class AFX_EXT_CLASS CMyString : public CString
{
// Your implementation code
};
O código consumidor usa uma mistura de CString e de CMyString. “ MyString.h” não é incluído no cabeçalho pré-compilado, e qualquer uso de CString não tem CMyString visível.
Suponha que você use as classes de CString e de CMyString nos arquivos de origem separado, Source1.cpp e Source2.cpp. Em Source1.cpp, você usa CMyString e o #include MyString.h. Em Source2.cpp, você usa CString, mas não faz o #include MyString.h. Em esse caso, o vinculador queixar-se-á sobre CStringT que é definido em. Isso é causado por CString que está sendo importado de DLL que CMyString, exportar e instanciado localmente pelo compilador através do modelo de CStringT .
Para resolver esse problema, faça o seguinte:
Exportar CStringA e CStringW (e as classes base de MFC90.DLL necessárias). Projetos que incluem o MFC sempre usará o MFC CStringA exportado DLL e CStringW, como em implementações anteriores MFC.
Crie uma classe derivada exportável usando o modelo de CStringT , como 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
};
Em AfxStr.h, substitua CStringanterior, CStringA, e typedefs de CStringW como segue:
typedef CStringT_Exported< wchar_t,
StrTraitMFC< wchar_t > > CStringW;
typedef CStringT_Exported< char,
StrTraitMFC< char > > CStringA;
typedef CStringT_Exported< TCHAR,
StrTraitMFC< TCHAR > > CString;
Há várias restrições:
Você não deve exportar CStringT próprio porque isso causará projetos de ATL-only exportar uma classe específica de CStringT .
Usando uma classe derivada exportável de CStringT minimiza que possuem funcionalidade de CStringT de que implementam. O código adicional é limitado a encaminhar construtores para a classe base de CStringT .
CString, CStringA, e CStringW só devem ser marcado __declspec(dllexport/dllimport) quando você está criando com uma DLL MFC compartilhado. Se vinculando com uma biblioteca estática MFC, você não deve marcar como exportadas; essas classes caso contrário, o uso interno de CString, de CStringA, e de CStringW dentro de DLL do usuário irá marcar CString como exportado também.