我正在为MSVC ++ 2012中的一个项目工作,我试图把它分成更小的部分。目前,依赖项看起来像这样:
output.exe --- deploy.dll --- coreext.dll
|
|-- physical.dll --- coreext.dll
|
|-- renderer.dll --- physical.dll --- coreext.dll
| |
| |-- coreext.dll
|
|-- engine.dll ----- physical.dll --- coreext.dll
|
|-- coreext.dll
我有一些全局数据在" physical.dll"但似乎这种变化并不适用于physical.dll的所有实例。该值在" deploy.dll"处发生变化。等级,但不是在" engine.dll"水平。目前,我使用隐式链接。实际输出中还有三层依赖关系,但我现在只是在这里处理这些部分。
对于我的生活,我似乎无法弄清楚如何将数据传递到适当的水平。我在renderer.dll和engine.dll中设置了一个函数来设置全局数据,但是当它与调试器一行一行时,一旦进入它就不是有效的指针 - 可能是某个虚拟地址的东西? / p>
我看到了this,这给了我一个不应该成为问题的印象。然后this将我引导至this,我正在阅读并试图绕过它。这是我第一次在Windows中这样做,我觉得我接近这种设计都是错误的。
我不想做大量的dumpbin和GetProcAddress(),因为有数以千计的功能要经过,这将是一个很难维持(但仍然我认为是自动化的,并且代码无处可去。除了将我的所有DLL更改为OBJ文件的集合并将它们链接起来 - 这有效,但让我回到原来的位置 - 我怎样才能使这个工作?
答案 0 :(得分:1)
只有程序的进程和线程才有自己的生命和数据。
DLL只是将一些相同的定义放在不同的文件中而不是像往常一样放在可执行文件中的技术手段。所以他们没有自己的数据。顺便说一下,虽然可能有多个程序实例被加载(每个实例都有自己独立的状态和全局变量),但只有一个DLL可以是loaded once。
因此,您显示的不是DLL的多个实例,而是对同一DLL的多个依赖项(除非您有不同版本的DLL)。
DLL的内容,代码和数据被映射到调用进程的地址空间。因此DLL中的全局变量确实是程序的全局变量。 DLL不能拥有自己的。最终,可以使用相同的DLL在进程之间共享数据,但需要创建共享数据段,如this MSDN article中所述。
但是,根据您的症状,您可能会定义多次全局数据(例如:标头中的静态定义,或使用匿名命名空间的标头中的全局定义)。在这种情况下,您会认为您始终引用相同的全局变量,但每个.obj和每个.dll都将使用自己的副本。