如何包含 DLL 的类?
Posted
技术标签:
【中文标题】如何包含 DLL 的类?【英文标题】:How to include classes of a DLL? 【发布时间】:2015-08-11 19:43:04 【问题描述】:我是在 C++ 中使用 DLL 的新手,我想知道如何成功加载和使用 DLL 中包含的类不会出现“损坏的堆栈”、“空指针”或任何应用程序崩溃 ^^。这让我现在有点困惑。 即使它可能更安全,我也不想使用接口类,因为它似乎使用起来太复杂了。我知道我应该在 DLL 和应用程序中包含相同的内容以防止崩溃。这意味着我的包含文件应该提到成员名称。
问题出在这里:
我想分发我的软件(DLL + 包含文件)但我不想 我的客户看到我的项目的架构。但唯一的班级 我想从我的 DLL 中导出,作为成员,来自其他对象的对象 类。所以我的班级依赖于其他班级等等 级联。
是否可以只提供一个类的一个包含文件,只提供有用的方法而不会有崩溃的风险?如果不是,哪些解决方案可能适合我的需求?
谢谢
【问题讨论】:
***.com/questions/27998/… 谢谢,这是一个有趣的话题,但我正在寻找一种不涉及使用接口类的方法。我想知道这是否可能。 @PadThai:不要使用接口类,使用接口的裸函数。这样,您就不会依赖于 C++ 类布局中特定于供应商和版本的变化。 Windows 有一个 C ABI,但 C++ 对象没有那么标准化(COM 涵盖的部分除外,它不包括数据成员)。 【参考方案1】:首先,如果您在 DLL 和使用它的应用程序中使用相同的包含,如果两者都使用相同的编译器和兼容设置进行编译,并且都使用相同的运行时库(DLL 之一,非静态链接),你应该没有你害怕的问题。
如果您想隐藏 DLL 的详细信息并向 DLL 用户提供经过更改的简化标头,则您需要自担风险。例如,如果缺少数据成员(甚至是私有的),或者如果缺少虚拟函数(甚至是私有的),那么它可能会崩溃,或者更糟的是,在不被注意的情况下破坏某些东西。所以我强烈建议您不要考虑这种方法,除非您对编译器生成的汇编程序非常有经验。
如果您想隐藏类的实现细节,最好的方法可能是围绕PIMPL idiom 设计您的库。
【讨论】:
以上是关于如何包含 DLL 的类?的主要内容,如果未能解决你的问题,请参考以下文章
从 DLL 导出包含 `std::` 对象(矢量、地图等)的类