程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 如何在Dll中導出STL類

如何在Dll中導出STL類

編輯:關於C++

簡介:本文詳述在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;
};

完整例子請查看實例代碼。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved