我们有一个用 C/C++ 编写的应用程序,它被分解为单个 EXE 和多个 DLL。这些 DLL 中的每一个都使用相同的静态库(utilities.lib
).
实用程序静态库中的任何全局变量实际上在应用程序内运行时都会有多个实例。每个模块(即 DLL 或 EXE)都会有一份全局变量的副本utilities.lib
已链接到。
(这都是众所周知的,而且很好,但是值得回顾一下静态库在 DLL 上下文中如何行为的一些背景知识。)
现在我的问题..我们想要改变utilities.lib
使其成为DLL。它变得非常庞大和复杂,我们希望以 DLL 形式分发它,而不是.lib
形式。问题是,对于这个应用程序,我们希望保留当前的行为,即每个应用程序 DLL 在实用程序库中都有自己的全局变量副本。你会怎样做呢?实际上,我们并不需要所有全局变量,只需要一些;但如果我们全部得到它也没关系。
我们的想法:
- 库中没有太多我们关心的全局变量,我们可以用一个访问器来包装它们,该访问器会执行一些时髦的技巧来尝试找出哪个 DLL 正在调用它。大概我们可以遍历调用堆栈并找出
HMODULE
对于每个函数,直到找到一个不是的函数utilities.dll
。然后我们可以根据调用的 DLL 返回不同的版本。
- 我们可以要求调用者在调用任何函数之前设置一个特定的全局变量(也可能是线程局部变量)
utilities.dll
。然后,实用程序 DLL 可以使用此全局变量值来确定调用上下文。
- 我们可以找到一些加载方式
utilities.dll
在运行时多次。也许我们需要在构建时制作多个重命名副本,以便每个应用程序 DLL 都可以拥有自己的实用程序 DLL 副本。这首先就否定了使用 DLL 的一些优点,但是还有其他应用程序不需要这种“静态库”样式的行为,并且仍然可以从中受益utilities.lib
变得utilities.dll
.
您可能最好只是让utilities.dll导出附加函数来分配和取消分配包含变量的结构,然后让每个其他工作DLL在需要时在运行时调用这些函数,例如在DLL_ATTACH_PROCESS和DLL_DETACH_PROCESS阶段DllEntryPoint()。这样,每个 DLL 都会获得自己的变量本地副本,并且可以将结构作为附加参数传递回utilities.dll 函数。
另一种方法是直接在每个工作 DLL 内本地声明各个变量,然后在需要时将它们作为输入/输出参数传递到utilities.dll 中。
无论哪种方式,都不要让utilities.dll尝试自行找出上下文信息。效果不会很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)