从dll导出C ++ - 域和集合

时间:2017-11-08 16:00:30

标签: c++ windows dll heap-corruption

关于跨dll边界的类和函数的堆栈溢出已经存在几个问题。

他们中的很多人都参考了这篇文章https://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL

我想深入了解一些并提出更具体的问题。

大多数问题的摘要是 1)在dll边界上导出模板和STL一般都很糟糕 2)您不能在dll边界的一侧分配并在另一侧释放。 3)你的选择是    a)仅导出纯C接口    b)导出可以在其内部实现中自由使用模板化和STL的抽象类。

确定。好吧,我在编写C ++的10年里从来没有这样做过,而且它从来没有把我扼杀在屁股上。我已经按照文章所说的那样和#34;天真的方法。"但是,我怨恨被称为天真一点点:),因为我在每个解决方案中始终拥有100%的源代码,并且始终使用相同的编译器和设置构建100%的源代码,并且一直注意到这一点。

最近,我收集了证据证明我在一个dll边界的一侧分配了一个对象并在另一个边缘释放了一个问题。所以,我可能会发现自己不得不改变自己的方式。也许,这是现在使用Nuget的第三方库的结果,而不是从源代码编译它们。

所以,我想知道,在域对象(或者在我的情况下,没有功能的对象)中如何使用这些选项

如果我永远不能使用std :: string,那么我假设导出的所有内容必须使用c风格的字符串,并且在我的解决方案中复制文本MB的数量增加了500倍,如果我想在内部使用std:string我的dlls。

更糟糕的是,我在思考这个问题:你如何拥有包含集合的域对象?

在我的" naive dll"

中考虑一个班级
class CustomerList
{
public:
    // where this is not trivial
    void AddCustomer(const Customer & customer);
private:
    std::vector<Customer> m_customers;
};

和我的dll中的函数或方法

SubmitCustomers(const CustomerList & customers);

如何使这个安全? 我是否需要在没有分配的情况下在纯C中重新发明矢量? 我是否必须使用大小的数组?呸?然后在内部更多地复制到STL容器?

0 个答案:

没有答案