Exporting String Classes Using CStringT
在過去, MFC 開發人員從 CString 衍生特製化自己的資料類別。 Microsoft Visual C++ .NET (MFC 8.0), CString 類別所呼叫的 CStringT樣板類別取代。 這提供了幾項優點:
允許 MFC CString 類別用於 ATL 專案,而不需要連接在較大的 MFC 靜態程式庫或 DLL。
新的 CStringT 樣板類別,您可以自訂 CString 行為使用指定配置特性的樣板參數,類似於範本中標準樣板程式庫 (STL) (STL) 中。
使用 CStringT時,在您從 DLL 匯出的資料類別,編譯器也會自動匯出 CString 基底類別。 因為 CString 本身是樣板類別,因為它可能是由編譯器產生,當使用,,除非編譯器知道 CString 從 DLL 匯入。 如果您從移轉至 Visual C++ 6.0 中的專案加入至 Visual C++ .NET 中,您可以乘上所定義的 CString 已經有提供連結器符號錯誤因為 DLL 和正確具版本匯入的 CString 的衝突。 適當的作法說明如下。 如需這個問題的詳細資訊,請參閱知識庫文件, 「連結錯誤,當您匯入 CString 衍生類別」(CString-Derived) 在 MSDN Library CD-ROM 或是在 https://support.microsoft.com/default.aspx。
下列情況會造成連結器產生符號錯誤為乘上所定義的類別。 舉例來說,假設您匯出 CString衍生類別 (CMyString) 從 MFC 擴充 DLL:
// MyString.h
class AFX_EXT_CLASS CMyString : public CString
{
// Your implementation code
};
消費者程式碼使用 CString 和 CMyString混合。「 MyString.h」在先行編譯標頭並不包含,,並 CString 陣列用法沒有可見的 CMyString 。
舉例來說,假設您在不同的原始程式檔, Source1.cpp 和 Source2.cpp 使用 CString 和 CMyString 類別。 在 Source1.cpp,您使用 CMyString 和 #include MyString.h。 在 Source2.cpp,您使用 CString,但是, MyString.h #include。 在此情況下,連結器將會是 CStringT 抱怨的多重定義。 這是由編譯器匯入與匯出的 DLL 和 CMyString正確具的 CString 造成的傳遞 CStringT 範本。
若要解決這個問題,請執行下列步驟:
匯出 CStringA 和 CStringW (和必要的基底類別) 與 MF C90 .dll。 包含 MFC 專案是在上一個 MFC 實作一律會使用 MFC DLL 匯出的 CStringA 和 CStringW。
使用 CStringT 範本,然後建立可匯出衍生類別,在中,當 CStringT_Exported 底下,例如:
#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
};
在 AfxStr.h,取代先前 CString、 CStringA和 CStringW typedef 如下所示:
typedef CStringT_Exported< wchar_t,
StrTraitMFC< wchar_t > > CStringW;
typedef CStringT_Exported< char,
StrTraitMFC< char > > CStringA;
typedef CStringT_Exported< TCHAR,
StrTraitMFC< TCHAR > > CString;
有幾個警告:
因為這會導致 ATL 專案匯出特殊 CStringT 類別,您不應匯出 CStringT 。
使用從 CStringT 的可匯出衍生類別將需要重新實作 CStringT 功能。 其他程式碼限制成轉送至 CStringT 基底類別的建構函式。
當您以共用的 MFC DLL 時,建置CString、 CStringA和 CStringW 只應標記為 __declspec(dllexport/dllimport) 。 如果連結至 MFC 靜態程式庫,您不應該將這些類別為匯出;否則,會 CString、 CStringA和 CStringW 的內部使用在使用者 DLL 內將會指示 CString 為匯出。