簡介:本文詳述在DLL中導出stl類及包含stl的類的方法。例子源碼
Dll無法直接導出泛型模板(generalized template),因此,如果要導出stl類,則模板必須先實例化(instantiated)。另外,如果導出的STL類使用了其他STL類,那麼這些其他類必須同時被導出。目前stl中唯一能夠被導出的容器是vector,其他容器(如map、set、queue、list、deque)都因包含嵌套類而不能被導出。
導出STL類的步驟:
在Dll和exe文件中,用同樣版本的c運行庫鏈接。譬如都用Msvcrt.lib(release)鏈接或都用Msvcrtd.lib(debug)鏈接。
Dll中,用__declspec(dllexport)導出模板類的實例。
在exe文件中,用__declspec(dllimport)和extern關鍵字從Dll中導入 stl類。
需要注意的是:當導出一個以自定義類為模板參數的stl容器,必須為這個自定義類型定義<和==運算符。譬如,如果要導出std::vector<CPerson>類,則必須為CPerson添加<和==運算符。如下: //導出stl類 std::vector<CPerson>
class CPerson
{
public:
int m_nAge;
char m_strName[40];
public:
bool operator < (const CPerson& c) const
{
return true;
}
bool operator == (const CPerson& c) const
{
return true;
}
};
EXPIMP_TEMPLATE template class VECDLL_API std::vector<CPerson> //顯示實例化模板類
VECDLL_API int fnVecDll(std::vector<CPerson>& vecPer); //導出函數
定義這兩個運算符的原因是:所有stl容器都有“比較”成員函數,這些成員函數需要調用自定義類型的<和==運算符。通常情況下,由於沒有使用這些成員函數,所以它們沒有被實例化,所以我們使用時一般就不需要為CPerson定義這兩個運算符。然而,當顯示實例化此容器類時,它所有的成員函數都需實例化,包括它的“比較”成員函數,所以這時必須實現CPerson的<和==運算符。如果CPerson並不在乎<和==的意義,我們可以像上面代碼所示通過簡單返回true來實現它們。
導出一個“數據成員包含stl對象”的類。方法與上類似。如下代碼所示:
EXPIMP_TEMPLATE template class VECDLL_API std::vector<int> //顯示實例化std::vector<int>
class VECDLL_API CContainer
{
public:
std::vector<int> m_vecNum;
};
完整例子請查看實例代碼。
本文配套源碼