如何模仿静态库的行为,但使用DLL“在应用程序中的全局变量的多个实例”?(How to mimic

2019-09-17 13:25发布

我们用C / C ++,其被分解成单个EXE和多个DLL的应用程序。 每个这些DLL都利用相同的静态库(的utilities.lib )。

在公用事业静态库的任何全局变量实际上将在应用程序中运行时有多个实例。 会有每个模块的全局变量(即DLL或EXE)是的一个副本utilities.lib已被链接到。

(这是所有已知的和好,但它的价值会超过上库DLL中的情况下如何静态行为的一些背景。)

现在我的问题。我们要改变utilities.lib ,使之成为一个DLL。 它正在成为非常庞大和复杂,我们希望它在DLL的形式,而不是分配.lib形式。 问题是,这一个应用程序,我们希望保留每个应用程序的DLL有它的图书馆事业中的全局变量的自己的副本目前的行为。 你会如何去这样做? 其实我们并不需要这个对所有的全局变量,只有一些; 但如果我们得到了所有它也没有什么关系。


我们的想法:

  1. 有迹象表明,我们所关心的,我们可以换他们每个人,做的试图找出哪些DLL正在调用它的一些时髦的绝招一个访问的库中没有的全局变量。 想必大家可以步行调用堆栈,并捞出HMODULE ,直到我们找到一个不是为每个功能utilities.dll 。 然后,我们可以返回取决于调用DLL的不同版本。
  2. 我们可以授权呼叫者之前调用任何功能设定一个特定的全局变量(也许还线程局部) utilities.dll 。 然后,公用事业DLL可以使用这个全局变量的值来确定调用上下文。
  3. 我们可以发现装载的一些方法utilities.dll在运行时多次。 也许,我们需要在编译的时候进行多次重命名副本,使每个应用程序的DLL可以有它的实用程序DLL的自己的副本。 这否定了一些首先使用DLL的优点,但也有其仍将受益不需要这种“静态库”式的行为和其他应用程序utilities.lib成为utilities.dll

Answer 1:

你可能是最好的关闭只是有utilities.dll输出的附加功能来分配和释放包含变量的结构,然后有其他每个工人的DLL调用需要的时候在运行时的功能,如在的DLL_ATTACH_PROCESS和DLL_DETACH_PROCESS阶段的DllEntryPoint()。 这样一来,每个DLL获取变量的本地副本,并且可以通过结构传回utilities.dll功能作为额外的参数。

另一种方法是简单地在本地声明单个变量每个工人DLL内直接,然后在需要时将它们传递到utilities.dll作为输入/输出参数。

无论哪种方式,不用utilities.dll揣摩其自己的上下文信息。 它不会很好地工作。



Answer 2:

如果我这样做,我会分解出的所有状态全局变量 - 我会导出COM对象或包含所有必需的状态的简单的C ++类,每个DLL出口将成为您的类中的方法。

回答您的具体问题:

  1. 你不能可靠地做这样的堆栈跟踪-由于像优化尾调用优化或FPO你不能确定谁在所有情况下给你打电话。 你会发现,你的程序将在调试工作,在释放,但崩溃工作大多偶尔。
  2. 我想你会发现这难以管理,而且它也让你的库不能重入与您的过程中的其他模块的需求 - 例如,如果你支持的回调或事件到另一个模块。
  3. 这是可能的,但你已经完全否定了使用DLL的点。 而不是重命名,你可以复制到不同的目录,并通过完整路径加载。


文章来源: How to mimic the “multiple instances of global variables within the application” behaviour of a static library but using a DLL?