Esportare le classi di stringa mediante CStringT

In passato, gli sviluppatori MFC derivati da CString per specializzare le proprie classi della stringa.In Microsoft Visual C++ .NET 8.0 (MFC), la classe CString è stata sostituita da una classe modello denominata CStringT.Ciò fornisce diversi vantaggi:

  • Consentita la classe MFC CString da utilizzare nei progetti ATL senza collegamento in più grande libreria statica MFC o DLL.

  • Con la nuova classe modello CStringT, è possibile personalizzare il comportamento CString utilizzo di parametri di modello che specificano i tratti di carattere, simili ai modelli nella libreria standard (STL) del modello.

  • Quando si esporta una classe di stringa da una DLL mediante CStringT, il compilatore automaticamente anche esporta la classe base CString.Poiché CString sia una classe modello, è possibile creare un'istanza dal compilatore quando viene utilizzata, a meno che il compilatore sia presente che CString viene incluso in una DLL.Se è stata eseguita la migrazione di progetti da Visual C++ 6,0 e Visual C++ .NET, possono verificarsi errori del simbolo del linker per CString con più livelli definito a causa del conflitto CString importato da una DLL e dalla versione locale creata un'istanza.La modalità corretta questo scopo viene descritta di seguito.Per ulteriori informazioni su questo problema, vedere l'articolo della Knowledge Base, "collegando gli errori quando si importa le classi derivate CString-" (Q309801) nel CD di MSDN Library o a https://support.microsoft.com/default.aspx.

Lo scenario seguente modo il linker a generare errori del simbolo vengono moltiplicati per le classi definite.Si supponga che si esportano CStringnella classe derivata da (CMyString) da una DLL di estensione MFC:

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

Il codice del consumer utilizza una combinazione CString e CMyString. MyString.h" non è incluso nell'intestazione precompilata e un utilizzo CString non ha CMyString visibile.

Si supponga di utilizzare le classi CMyString e CString in file di origine distinti, Source1.cpp e Source2.cpp.In Source1.cpp, utilizzare CMyString e il MyString.h #include.In Source2.cpp, utilizzare CString, ma non si MyString.h #include.In questo caso, il linker protesterà su CStringT che si moltiplica definito.Ciò è dovuto a CString sia incluso dalla DLL che esporta CMyStringche crea un'istanza di in locale dal compilatore tramite il modello CStringT.

Per risolvere questo problema, effettuare le operazioni seguenti:

Esportare CStringA e CStringW (e le classi di base necessarie) da MFC90.DLL.I progetti che includono MFC utilizzano sempre CStringA esportato DLL MFC e CStringW, come nelle implementazioni precedenti MFC.

Creare quindi una classe derivata esportabile utilizzando il modello CStringT, mentre CStringT_Exported è sotto, ad esempio:

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

In AfxStr.h, sostituire CStringprecedente, CStringAe i typedef CStringW come segue:

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

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

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

Esistono alcune:

  • Non è necessario esportare CStringT stesso perché in tal modo i progetti solo ATL esportare una classe specializzata CStringT.

  • Utilizzando una classe derivata esportabile da CStringT si riduce devono funzionalità CStringT di dover implementare.Il codice aggiuntivo è limitato a costruttori di inoltro alla classe base CStringT.

  • CString, CStringAe CStringW devono essere solo __declspec(dllexport/dllimport) contrassegnata come quando si compila con una DLL condivisa di MFC.Se il collegamento a una libreria statica MFC, non è necessario contrassegnare queste classi come esportate, in caso contrario, l'utilizzo interno CString, CStringAe CStringW nelle DLL dell'utente CString contrassegnato automaticamente come esportato anche.

Argomenti correlati

Classe di CStringT

Vedere anche

Altre risorse

Utilizzando CStringT

Utilizzando CString