我们有一个用 C/C++ 编写的应用程序,它被分解为一个 EXE 和多个 DLL。这些 DLL 中的每一个都使用相同的静态库 ( utilities.lib
)。
实用程序静态库中的任何全局变量实际上在应用程序的运行时都会有多个实例。每个链接到的模块(即 DLL 或 EXE)将有一份全局变量的副本utilities.lib
。
(这都是众所周知的,但值得回顾一下静态库在 DLL 上下文中如何表现的背景知识。)
现在我的问题.. 我们想改变utilities.lib
它,使它成为一个 DLL。它变得非常庞大和复杂,我们希望以 DLL 形式而不是.lib
形式分发它。问题在于,对于这个应用程序,我们希望保留每个应用程序 DLL 在实用程序库中拥有自己的全局变量副本的当前行为。 你会怎么做呢? 实际上我们并不需要所有的全局变量,只有一些;但如果我们得到它并不重要。
我们的想法:
- 我们关心的库中的全局变量并不多,我们可以用一个访问器包装它们中的每一个,该访问器执行一些时髦的技巧来试图找出哪个 DLL 正在调用它。大概我们可以遍历调用堆栈并找出
HMODULE
for 每个函数,直到找到一个不是utilities.dll
. 然后我们可以根据调用 DLL 返回不同的版本。 - 我们可以要求调用者在调用
utilities.dll
. 实用程序 DLL 然后可以使用这个全局变量值来确定调用上下文。 - 我们可以找到一些
utilities.dll
在运行时多次加载的方法。也许我们需要在构建时制作多个重命名的副本,以便每个应用程序 DLL 都可以拥有自己的实用程序 DLL 副本。这首先否定了使用 DLL 的一些优点,但是还有其他应用程序不需要这种“静态库”样式行为,并且仍然可以utilities.lib
从utilities.dll
.