請問有關std::vector於VC++ DLL給BC++用之問題 |
答題得分者是:aftcast
|
jesson
一般會員 發表:11 回覆:16 積分:5 註冊:2002-04-21 發送簡訊給我 |
請問各位前輩,小弟在VC++中寫了一個函式,該函式中有函一個引數為 vector<int> *vTemp,且將此函式包裝成win32 extern "C"(可抑制 name mangling 的行為)
__declspec(dllexport)之DLL;亦有宣告 using namespace std; 但奇怪的事情發生,就是此 DLL 函式在VC 用都沒問題,但在BC 用就會發生資料 push_back有誤的錯誤訊息,小弟 猜是不是 vector 是屬於 c 的東西,若用 extern "C" export 出會有問題呢?但不加 extern "C" 又無法抑制 name mangling ,懇請各位大大指點迷津;小弟的目的為:在VC 中包裝函式成DLL,且該函式中包含 vector 引數,最後將此DLL給BC 用!懇請賜教~~~感恩 |
jesson
一般會員 發表:11 回覆:16 積分:5 註冊:2002-04-21 發送簡訊給我 |
小弟有找一下,發現網路上有人用純 C 寫一個 simclist-1.5 API,但小弟下載來用時,發現一些 *.h 缺,Compiler他的範例檔一直不過 ,看了他的Folder有說要用cmake的軟體,進行Compiler,但我用cmake 2.6 & 2.8 測試過,再用 VS.Net 2008 Build All還是出現一些*.h找不到的問題。 不知各位前輩,是否有成功使用過 simclist-1.5 此API,小弟心想,山不轉路轉,假如是純 C 的話,應該就不會因 vector 是C 的STL的東西,導致VC 包裝含有vector引數函式的DLL,無法正確加入LIB至BC 中使用,name mangling 的問題小弟無法招架,vector 又是一個樣板類別庫的東西,VC 封裝有類別的東西出來當引數用,真的是有很大的不同處使用於BC 中,可能是處裡類別的方式,兩者不同吧!懇請各位前輩賜教,感恩囉~~~ |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
我用google找到的,而且第一篇還有範例可以下載,看能不能解決你的問題
如何在Dll中导出STL类 http://www.bianceng.cn/Programming/cplus/201006/17665.htm 範例下載 http://img.bianceng.cn/upimg/soft/1006/4-100612094450.rar How to export an instantiation of a Standard Template Library (STL) class and a class that contains a data member that is an STL object http://support.microsoft.com/kb/168958 |
jesson
一般會員 發表:11 回覆:16 積分:5 註冊:2002-04-21 發送簡訊給我 |
非常感謝您的回覆,我找個時間測試一下,看看結果如何,是否能達到我的需求,在分享出來.....忙忙忙
===================引 用 bugmans 文 章=================== 我用google找到的,而且第一篇還有範例可以下載,看能不能解決你的問題 如何在Dll中导出STL类 http://www.bianceng.cn/Programming/cplus/201006/17665.htm 範例下載 http://img.bianceng.cn/upimg/soft/1006/4-100612094450.rar How to export an instantiation of a Standard Template Library (STL) class and a class that contains a data member that is an STL object http://support.microsoft.com/kb/168958 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我認為export vector 給不同的語言平台(如vc對bcb)用根本是不可行的!
重點不在於mangling,而是對vector的實作二家不同,且對記憶體的管理模組也不一樣。這問題好比 你若在bcb裡new好一個空間,然後傳入vc的dll裡的一個指標,然後在dll去下delete,會如何? 為了解決這類的問題,一般都是透過win32 api中關於記憶體的管理來用,即不用new的方式,而是如叫GlobalAlloc等api,這樣不同的語言叫用dll就不會有誰new誰刪的問題。 ===================引 用 jesson 文 章=================== 請問各位前輩,小弟在VC 中寫了一個函式,該函式中有函一個引數為 vector __declspec(dllexport)之DLL;亦有宣告 using namespace std; 但奇怪的事情發生,就是此 DLL 函式在VC 用都沒問題,但在BC 用就會發生資料 push_back有誤的錯誤訊息,小弟 猜是不是 vector 是屬於 c 的東西,若用 extern "C" export 出會有問題呢?但不加 extern "C" 又無法抑制 name mangling ,懇請各位大大指點迷津;小弟的目的為:在VC 中包裝函式成DLL,且該函式中包含 vector 引數,最後將此DLL給BC 用!懇請賜教~~~感恩
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
jesson
一般會員 發表:11 回覆:16 積分:5 註冊:2002-04-21 發送簡訊給我 |
感謝 蕭兄 的回應,小弟有找到 GSL gsl_vector 它是用 C 語言包裝起來的,當然對記憶體管理方式也是遵循C語言
,經小弟測試過,確實可在 VC 轉 BCB 用,運行正常,但是 它不能塞 自訂的類別或結構,只能塞簡單的 int or double;小弟淺見,若是遵循古法自己用C語言包成自己想用的容器來用,應該可行!但如 蕭兄 所言 vector 是C STL 的產物,因 VC 與 BCB 是對於所謂的類別 或樣板屬不同運行方式,亦對記憶體的管理取用,因有其不同,若BCB要引用VC的容器是不可行(我也這麼認為)。 GlobalAlloc win32 api (鎖定固定一塊記憶體)這小弟用過,就如 蕭兄 所言,記憶體管理比較沒問題,不知裡面塞類別或結構是否沒問題,可以試試看~~~~感恩...... ===================引 用 aftcast 文 章=================== 我認為export vector 給不同的語言平台(如vc對bcb)用根本是不可行的! 重點不在於mangling,而是對vector的實作二家不同,且對記憶體的管理模組也不一樣。這問題好比 你若在bcb裡new好一個空間,然後傳入vc的dll裡的一個指標,然後在dll去下delete,會如何? 為了解決這類的問題,一般都是透過win32 api中關於記憶體的管理來用,即不用new的方式,而是如叫GlobalAlloc等api,這樣不同的語言叫用dll就不會有誰new誰刪的問題。 ===================引 用 jesson 文 章=================== 請問各位前輩,小弟在VC 中寫了一個函式,該函式中有函一個引數為 vector __declspec(dllexport)之DLL;亦有宣告 using namespace std; 但奇怪的事情發生,就是此 DLL 函式在VC 用都沒問題,但在BC 用就會發生資料 push_back有誤的錯誤訊息,小弟 猜是不是 vector 是屬於 c 的東西,若用 extern "C" export 出會有問題呢?但不加 extern "C" 又無法抑制 name mangling ,懇請各位大大指點迷津;小弟的目的為:在VC 中包裝函式成DLL,且該函式中包含 vector 引數,最後將此DLL給BC 用!懇請賜教~~~感恩 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |