我有一个 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 一样简单的解决方案。
最佳答案
您可以在 DLL 之间传递 STL 对象并支持不同的编译器,如果您在实例化每个 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 类型,例如,字符串列表或 vector
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 导出的二进制代码,而不是实例化它们自己的代码。
关于c++ - 如何在 DLL 边界上公开 STL 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1881494/