相关疑难解决方法(0)

如何在我的dll界面或ABI中使用标准库(STL)类?

在导出包含与visual studio警告C4251相关的stl类的类之前,有一些问题:例如这个问题或这个问题.我已经阅读过UnknownRoad的优秀解释.

盲目地禁用警告似乎有点危险,尽管它可能是一种选择.包装所有这些std类并导出它们也不是一个真正的选择.它毕竟被称为标准模板库...即,想要提供这些标准类的接口.

如何在我的dll界面中使用stl-classes?什么是常见做法?

c++ dll stl std c++11

62
推荐指数
1
解决办法
1万
查看次数

如何在DLL边界上公开STL列表?

我有一个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();
}
Run Code Online (Sandbox Code Playgroud)

现在,DLL可以通过该接口对向量的数据进行安全的只读访问.DLL也可以包装它以将内容复制到自身的向量中.

那么STL列表(和deques)呢?是否有另一种直接允许通过DLL边界访问的方法?或者我是否必须使用某种GetFirst()/ GetNext()接口?我可能需要为很多列表执行此操作,因此有一个像vector一样简单的解决方案会很好.

c++ stl list abi pod

8
推荐指数
2
解决办法
7088
查看次数

DLL和STL以及静态数据(哦,我的!)

好的.....我已经完成了相关问题的所有阅读,以及一些MSDN文章,以及大约一天的谷歌搜索.

这个问题的当前"最新状态"回答是什么:

我正在使用VS 2008,C++非托管代码.我有一个包含相当多DLL和很多EXE的解决方案文件.只要我完全控制构建环境,使得所有的部件和部件都使用相同的标志构建,并使用相同的运行时库,并且没有人拥有静态链接的CRT库,我可以传递STL对象吗?

看起来这应该没问题,但根据您阅读的文章,有很多恐惧,不确定性和怀疑.

我知道在幕后产生静态数据的模板有各种各样的问题(每个dll都会得到自己的副本,导致心痛),但是常规旧STL怎么样?

c++ windows dll stl visual-studio

5
推荐指数
2
解决办法
1939
查看次数

标签 统计

c++ ×3

stl ×3

dll ×2

abi ×1

c++11 ×1

list ×1

pod ×1

std ×1

visual-studio ×1

windows ×1