Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
CStringhasználatát ATL-projektekben anélkül, hogy a nagyobb MFC statikus kódtárban vagy DLL-ben kapcsolódott volna.Az új
CStringTsablonosztályban a C++ Standard kódtár sablonjaihoz hasonló karaktertulajdonságokat meghatározó sablonparaméterek használatával testre szabhatjaCStringa viselkedést.Ha saját sztringosztályt exportál egy DLL-ből
CStringT, a fordító automatikusan exportálja az alaposztálytCStringis. MivelCStringmaga is sablonosztály, használat esetén a fordító példányosíthatja azt, hacsak a fordító nem tudja, hogyCStringdll-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éseCStringmiatt linkerszimbólumhibákat láthatott egy szorzásos definícióCStringeseté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
CStringTmagát, mert ez a csak ATL-projektek speciális osztály exportálásátCStringTeredményezi.Exportálható származtatott osztály használata a
CStringTminimálisra csökkenti a funkciók újbóli implementálásátCStringT. A további kód a konstruktorok alaposztályba való továbbításáraCStringTkorlátozódik.CString,CStringAésCStringWcsak 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 aCStringfelhasználóiCStringACStringWDLL-ek belső használata is exportáltként jelenikCStringmeg.