我有一个 DLL,需要访问主机应用程序中 STL 容器中存储的数据。因为 C++ 没有标准的 ABI,而且我想支持不同的编译器,所以应用程序和 DLL 之间的接口基本上必须保持普通旧数据。
对于向量来说,这相对简单。您可以简单地返回向量的内存块,因为它保证是连续的:
// 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 列表(和双端队列)又如何呢?是否有另一种直接的方法来允许通过 DLL 边界进行访问?或者我必须求助于某种 GetFirst()/GetNext() 接口?我可能需要对很多列表执行此操作,因此最好有一个像向量一样简单的解决方案。
如果您小心地实例化每个 stl 类型,则可以在 DLL 之间传递 stl 对象并支持不同的编译器。您需要一些智能的“DLLEXPORT”宏——我使用以下设置来成功支持 VC 和 gcc。
#ifdef WIN32
#ifdef MYDLLLIB_EXPORTS // DLL export macros
#define MYDLLLIB_API __declspec(dllexport)
#define MYDLLLIB_TEMPLATE
#else
#define MYDLLLIB_API __declspec(dllimport)
#define MYDLLLIB_TEMPLATE extern
#endif
#else // Not windows --- probably *nix/bsd
#define MYDLLLIB_API
#ifdef MYDLLLIB_EXPORTS
#define MYDLLLIB_TEMPLATE
#else
#define MYDLLLIB_TEMPLATE extern
#endif
#endif // WIN32
编译 DLL 时,定义 MYDLLLIB_EXPORTS。然后,您可以在 DLL 中实例化您想要使用的每个 stl 类型,例如字符串列表或向量
MYDLLLIB_TEMPLATE template class MYDLLLIB_API std::vector<std::string>;
MYDLLLIB_TEMPLATE template class MYDLLLIB_API std::list<std::string>;
DLL 的使用者(未定义 MYDLLLIB_EXPORTS)将看到
extern template class __declspec(dllimport) std::vector<std::string>;
并使用从 DLL 导出的二进制代码,而不是实例化自己的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)