我有一个DLL,需要访问主机应用程序中STL容器中存储的数据。因为C++没有标准的ABI,并且我想支持不同的编译器,所以应用程序和DLL之间的接口(interface)基本上必须保留纯旧数据。
对于 vector ,这是相对简单的。您可以简单地返回 vector 的存储块,因为可以保证它是连续的:
// 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可以通过该接口(interface)对 vector 的数据进行安全的只读访问。 DLL也可以将其包装以将内容复制到自身的 vector 中。
STL列表(和双端队列)如何处理?是否存在另一种直接允许通过DLL边界访问的方法?还是我必须诉诸某种GetFirst()/GetNext()接口(interface)?我可能需要对很多列表执行此操作,因此最好有一个像vector一样简单的解决方案。
最佳答案
也许您可以将“句柄”之类的东西传递给列表/出队迭代器?这些句柄类型将是不透明的,并在要发送给用户的头文件中声明。在内部,您需要将句柄值映射到列表/出列迭代器。基本上,用户将编写如下代码:
ListHandle lhi = GetListDataBegin();
const ListHandle lhe = GetListDataEnd();
while (lhi != lhe)
{
int value = GetListItem(lhi);
...
lhi = GetNextListItem(lhi);
}
关于c++ - 如何通过DLL边界公开STL列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1881494/