DLL中全局变量使用的限制(适用于Windows)

Vic*_*nin 0 c++ windows dll

首先,我知道全局变量是邪恶的:)然而,有合法的情况,为什么我需要使用一个.

我知道在DllMain中可以执行的内容有非常严格的限制(没有LoadLibraries,没有COM初始化等等).

我知道全局变量在DllMain DLL_PROCESS_ATTACH之前初始化.

全局变量初始化时是否有相同的限制?

我发现微软文章:http://msdn.microsoft.com/en-us/library/988ye33t 但是,它没有任何与限制相关的细节.

我还看到了另一个Stackoverflow问题:在DLL中声明的全局变量会发生什么? 这里有一段摘录"在DllMain中有些东西是被禁止的.在构造函数中也可能禁止这些东西."

但是,看起来评论员不确定这些限制是否确实存在.

我希望有关此主题的任何信息.

Mat*_*lia 6

正如在我的这个答案中所解释的那样,真正的dll入口点(即真实的DllMain)是由CRT采取的,即on DLL_PROCESS_ATTACH,初始化它的东西,调用全局变量的构造函数,然后调用"假" DllMain(即你作为一个程序员看到DllMain).

MSDN文档调用DllMain真正的 DLL入口点,因此,所有的限制也适用于全球对象的构造,因为它们是由叫.

这是避免全局变量的另一个原因:它们的构造函数中的代码被调用DllMain,但这并不明显,所以如果出现问题来自做"禁止"的事情DllMain可能需要花费很多时间才能确认违规代码在这样的构造者中.