关于dll接口函数返回对象(对象里有vector容器)的一个小小小小小小小小小小小小小问题
我正在用BCB6写一个动态链接库(dll),打算在vc和ActiveX控件里调用。
我要在接口函数里返回一个容器,网上说会有问题,最好是把容器封装到结构体里面,所以我写了一个类,里面含有两个容器,一个vector一个map。
但是当我返回这个类的对象时,并在APP里定义了相同的类,来接收这个对象,可是打印出来之后的东西很乱,是指针指错了内存的症状(我在dll定义的其他毫无相关的变量都打印了出来)。
我想问的是,我这样做是不是可行的。如果可行哪里出错了呢(内存分配?)
如果不行有什么办法传递这个容器呢?(用数组?)
谢谢
[解决办法]
dll最初是用c标准的,因此对容器,TForm等这些最好用activex来做更通用。
[解决办法]
如果在接口里直接传递STL容器,会发生问题,因为很多STL容器含有静态成员,APP和DLL的内存空间又不一样
在dll里定义了一个vector并push_back了一些数据,这个循环结束之后我立即打印出这些数据
请贴代码
[解决办法]
1、有人说str不能为NULL,为什么啊
std::string 構造或賦值,不接受 NULL 指針 可以使用 "" ,但不能用 NULL ;
2、但都是设计到字符串,而且还有一一对应的关系,如果不用STL用什么啊 char**?
如果內部要使用 std::map , 建議DLL寫接口將 std::map 封裝起來,不曝露std::map給外部調用。DLL內使用STL類,需要做黑盒處理,也就是DLL接口中看不見STL模板類。
如果非得將 std::map 曝露出來,那麼你得將 std::map 的頭文件同樣發佈,這就相當於要求別人與你用同樣的 STL 庫版本,而且還得檢查編譯選項,以保障內存佈局一致,函數調用方式一樣。或者你重寫一個可供共用的 std::map 類。