全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1730
推到 Plurk!
推到 Facebook!

請問有關std::vector於VC++ DLL給BC++用之問題

答題得分者是:aftcast
jesson
一般會員


發表:11
回覆:16
積分:5
註冊:2002-04-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-04-09 16:46:22 IP:111.184.xxx.xxx 訂閱
請問各位前輩,小弟在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-04-10 00:45:26 IP:111.184.xxx.xxx 訂閱

小弟有找一下,發現網路上有人用純 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-04-11 06:37:20 IP:114.44.xxx.xxx 未訂閱
我用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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-04-11 16:51:47 IP:61.230.xxx.xxx 訂閱
非常感謝您的回覆,我找個時間測試一下,看看結果如何,是否能達到我的需求,在分享出來.....忙忙忙


===================引 用 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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-04-21 10:56:46 IP:210.64.xxx.xxx 訂閱
我認為export vector 給不同的語言平台(如vc對bcb)用根本是不可行的!

重點不在於mangling,而是對vector的實作二家不同,且對記憶體的管理模組也不一樣。這問題好比

你若在bcb裡new好一個空間,然後傳入vc的dll裡的一個指標,然後在dll去下delete,會如何?

為了解決這類的問題,一般都是透過win32 api中關於記憶體的管理來用,即不用new的方式,而是如叫GlobalAlloc等api,這樣不同的語言叫用dll就不會有誰new誰刪的問題。

===================引 用 jesson 文 章===================
請問各位前輩,小弟在VC 中寫了一個函式,該函式中有函一個引數為 vector *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 用!懇請賜教~~~感恩
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
jesson
一般會員


發表:11
回覆:16
積分:5
註冊:2002-04-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-04-25 15:53:23 IP:61.230.xxx.xxx 訂閱
感謝 蕭兄 的回應,小弟有找到 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 *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 用!懇請賜教~~~感恩
系統時間:2017-12-12 4:55:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!