Megosztás a következőn keresztül:


Sztringosztályok exportálása a CStringT használatával

Megjegyzés:

A Microsoft Foundation Classes (MFC) és az Active Template Library (ATL) továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

A múltban az MFC-fejlesztők a saját sztringosztályaikra specializálódtak CString . A Microsoft Visual C++.NET -ben (MFC 8.0) a CString osztályt felváltotta egy CStringT nevű sablonosztály. Ez számos előnnyel jár:

  • Lehetővé tette az MFC-osztály CString használatát ATL-projektekben anélkül, hogy a nagyobb MFC statikus kódtárban vagy DLL-ben kapcsolódott volna.

  • Az új CStringT sablonosztályban a C++ Standard kódtár sablonjaihoz hasonló karaktertulajdonságokat meghatározó sablonparaméterek használatával testre szabhatja CString a viselkedést.

  • Ha saját sztringosztályt exportál egy DLL-ből CStringT, a fordító automatikusan exportálja az alaposztályt CString is. Mivel CString maga is sablonosztály, használat esetén a fordító példányosíthatja azt, hacsak a fordító nem tudja, hogy CString dll-ből importálják. Ha a projekteket a Visual C++ 6.0-ból a Visual C++.NET-be migrálta, előfordulhat, hogy a dll-ből importált és a helyileg példányosított verzió ütközése CString miatt linkerszimbólumhibákat láthatott egy szorzásos definíció CString esetében. Ennek megfelelő módját az alábbiakban ismertetjük.

Az alábbi forgatókönyv azt eredményezi, hogy a csatoló szimbólumhibákat okoz a szorzó által definiált osztályokhoz. Tegyük fel, hogy egy CString-származtatott osztályt (CMyString) exportál egy MFC-bővítmény DLL-éből:

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

A fogyasztói kód az és CMyStringa CString . A "MyString.h" nem szerepel az előre összeállított fejlécben, és a használat egy része CString nem CMyString látható.

Tegyük fel, hogy az osztályokat és CMyString az CString osztályokat külön forrásfájlokban, Source1.cpp és Source2.cpp használja. A Source1.cpp a MyString.h használatát CMyString és #include. A Source2.cpp használja CString, de ne #include MyString.h. Ebben az esetben a linker panaszkodni fog a szorzás definiálása miatt CStringT . Ezt az okozza CString , hogy mind az exportált CMyStringDLL-ből, mind a fordító helyileg példányosított a CStringT sablonon keresztül.

A probléma megoldásához tegye a következőket:

Exportálás CStringA és CStringW (és a szükséges alaposztályok) MFC90.DLL. Az MFC-t tartalmazó projektek mindig az exportált MFC DLL-t CStringA használják, és CStringWa korábbi MFC-implementációkhoz hasonlóan.

Ezután hozzon létre egy exportálható származtatott osztályt a CStringT sablon használatával, ahogyan CStringT_Exported az alább látható, például:

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

Az AfxStr.h fájlban cserélje le az előzőt CString, CStringAés CStringW írja be a következőt:

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

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

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

Több kikötés is létezik:

  • Ne exportálja CStringT magát, mert ez a csak ATL-projektek speciális osztály exportálását CStringT eredményezi.

  • Exportálható származtatott osztály használata a CStringT minimálisra csökkenti a funkciók újbóli implementálását CStringT . A további kód a konstruktorok alaposztályba való továbbítására CStringT korlátozódik.

  • CString, CStringAés CStringW csak akkor kell megjelölni __declspec(dllexport/dllimport) , ha megosztott MFC-DLL-t készít. Ha egy statikus MFC-kódtárhoz kapcsolódik, ezeket az osztályokat nem szabad exportáltként megjelölni; ellenkező esetben a CStringfelhasználói CStringACStringW DLL-ek belső használata is exportáltként jelenik CString meg.

CStringT osztály

Lásd még

A CStringT használata
A CString használata