Sdílet prostřednictvím


Export třídy String pomocí CStringT

V minulosti jste vývojáři MFC odvozené z CString do specialize vlastní třídy string.V aplikaci Microsoft Visual C++ .net (MFC 8.0) CString třída byla nahrazena šablona třídy nazvané CStringT.To za předpokladu, že několik výhod:

  • Povoleno jednotka MFC CString třídy v ATL projekty bez propojení větší statické knihovny MFC nebo knihovny DLL.

  • S novým CStringT můžete upravit šablonu třídy CString chování pomocí šablony parametrů zadaných znaků znaky podobné šablony ve standardní šabloně knihovny (STL).

  • Při exportu řetězec třídy z knihovny DLL pomocí CStringT , kompilátor automaticky exportuje CString základní třída.Od CString je šablona třídy, jej může být vytvořeno kompilátorem při použití, pokud je kompilátor vědom, CString importovány z knihovny DLL.Pokud migraci projektů z Visual C++ 6.0 k Visual C++ .net běžných symbol chyby pro násobení definovaného CString kvůli kolizi s CString dovážené z knihoven DLL a místně vytvořenou instancí verze.Správný způsob je popsáno níže.Další informace o tomto problému naleznete v článku znalostní báze Knowledge Base "propojení chyby při importu CString odvozené třídy" (Q309801) na disku CD-ROM MSDN Library, nebo na https://support.microsoft.com/default.aspx.

Následující scénář způsobí linker vyrábět symbol chyby násobit definovaných tříd.Předpokládejme, že exportujete CString -odvozené třídy (CMyString) z rozšíření MFC knihovny DLL:

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

Kód spotřebitel používá směs CString a CMyString . "MyString.h"není součástí předkompilovaný záhlaví a některé využití CString nemá CMyString viditelné.

Předpokládají, že používají CString a CMyString třídy v samostatných zdrojové soubory, Source1.cpp a Source2.cpp.V Source1.cpp, můžete použít CMyString a MyString.h #.V Source2.cpp, můžete použít CString , ale ne # patří MyString.h.V tomto případě bude stěžovat linker CStringT definovaného násobit.To je způsobeno CString i dovážené z knihovny DLL, která exportuje se CMyString , místně obvyklá kompilátorem prostřednictvím a CStringT šablony.

Chcete-li vyřešit tento problém, postupujte takto:

Export CStringA a CStringW (a nezbytné základní třídy) z MFC90.DLL.Projekty, které zahrnují MFC bude vždy používat knihovnu DLL MFC vyvážené CStringA a CStringW , jako v předchozích implementací MFC.

Vytvořte exportovatelný odvozené třídy pomocí CStringT šablony, jako CStringT_Exported je níže, například:

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

V AfxStr.h, nahradí předchozí CString , CStringA , a CStringW funkce TypeDef takto:

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

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

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

Existuje několik upozornění:

  • Vhodné exportovat CStringT sám protože to způsobí pouze ATL projektů exportovat specializované CStringT třídy.

  • Pomocí exportovat odvozené od třídy CStringT minimalizuje museli re-implement CStringT funkce.Doplňkový kód je omezena na předávání pro konstruktory CStringT základní třída.

  • CString, CStringA , a CStringW pouze by měla být označena __declspec(dllexport/dllimport) při vytváření MFC s sdílené knihovny DLL.Propojení u statických knihoven MFC, neměla označení těchto tříd jako vyvezeno; v opačném případě vnitřní použití CString , CStringA , a CStringW uvnitř bude uživatel knihovny DLL označit CString jako i exportovány.

Příbuzná témata

Třída CStringT

Viz také

Další zdroje

Pomocí CStringT

Pomocí CString