DLL 中具有多个类和全局变量的多个 DLL

multiple dlls with multiple classes and global variables in dll

本文关键字:DLL 全局变量      更新时间:2023-10-16

大家,一天中的好时光!

我对C++.dll编程有一些疑问,这对我来说是相当新的。

1)如果我想创建具有多个类的DLL,但我仍然想为每个类创建抽象接口,我应该为接口创建一个头文件,还是为每个抽象类创建单独的多个头文件?我应该如何处理工厂功能的实现.cpp?

2)如果我创建对象和工厂函数,并获取指向实例的指针,那么当我想释放该内存时,我可以在程序中调用"删除"吗?我认为,该对象放置在dll的页面中,可能存在一些问题。在这种情况下,我应该怎么做才能正确释放内存?

3)我读到,如果多个进程绑定.dll - dll为每个项目创建全局变量的单独实例。对吗?那么如果这是真的,我有两个问题:

3.1)dll中的静态成员会发生什么?如果我想创建单一实例管理器,是否可以将其放在 dll 中?

3.2)如果我有核心.dll和图形.dll,声音.dll和物理.dll。Core.dll 有一个全局变量(在我的真实情况下是一个单例管理器)。其他 dll 是否适用于单例的一个实例或其他实例?(每个 dll 都使用核心.dll)

对于我的英语薄弱和在一个主题中的许多问题,我深表歉意:)

感谢您的关注和回答。

1:这主要取决于您,并取决于项目的规模。在小的事情上,它无关紧要,所以保持简单并有一个标题。在较大的项目中,最好尽可能减少不必要的相互依赖关系 - 因此将它们放在单独的文件中。您始终可以创建仅包含其他内容的"all.h"。

2:是的,如果 DLL 和 EXE 都链接到多线程 DLL CRT。除非您知道自己在做什么,否则请始终使用它,因为它是最安全的并且会做您期望的 - 它会导致 exe 和 dll(s) 能够共享堆,就好像它们是单个可执行文件一样。您可以在 dll 中自由地"new Object()"和 exe 中的"删除 obj"。注意:混合不同版本的 EXE 和 DLL 可能会引入非常微妙的错误(例如,如果类/结构定义发生变化),所以不要这样做。

3:每个进程都有自己独立的内存空间(除非你专门做某些事情来尝试获取一些共享内存)。不允许进程进入其他进程的内存。

3.1:我强烈建议你避免全局状态。(全局静态常量是可以的)。全局变量会导致许多意想不到的困难问题,Windows DLL 中的全局变量具有许多其他复杂性。 从长远来看,最好在 EXE 必须调用的 DLL 中使用显式的"初始化/取消初始化"函数。

但是,dll 中的全局静态与可执行文件中的全局静态没有太大区别......加载 DLL 时,它们以几乎相同的方式进行初始化。(动态加载 DLL 时,操作会变得更加复杂,但让我们在这里忽略它)。

3.2:是的,他们会使用单个实例 - 但无论如何不要这样做,你最终会后悔的。使初始化显式要好得多,因为您无法控制构造全局变量的顺序,这很快就会导致非常困难的初始化问题。