我有一個DLL需要訪問主機應用程序中存儲在STL容器中的數據。因爲C++沒有標準的ABI,並且我想支持不同的編譯器,所以應用程序和DLL之間的接口基本上必須保持普通的舊數據。如何在DLL邊界上公開STL列表?
對於載體,這是相對簡單的。您可以簡單地返回向量的內存塊,因爲它是保證contigious:
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
現在DLL可以通過該接口的矢量數據的安全只讀訪問。該DLL也可以包裝它以將內容複製到自身的矢量中。
但是STL列表(和deques)呢?是否有另一種直接的方式允許通過DLL邊界訪問?或者我將不得不訴諸某種GetFirst()/ GetNext()接口?我可能需要爲許多列表執行此操作,所以最好有一個像vector一樣簡單的解決方案。
你說得對,如果所有的編譯設置都一樣的話,我可以避開它。但是這是一個插件架構,我想支持不同的編譯器。我編輯了這個問題來澄清這一點。 – AshleysBrain 2009-12-10 15:05:58
我同意這一點,但也許你應該強調,它不僅僅是佈局 - 代碼必須已經用相同版本的編譯器編譯,以便像new和delete這樣的方法的實現相匹配。 – 2009-12-10 15:06:30
如果您嚴格執行構建設置/編譯器版本並且所有內容都在您的控制之下,那麼DLL的優勢與使用靜態庫並將所有內容鏈接到一個可執行文件中有什麼區別? – 2009-12-11 10:02:46