首先,我知道全局变量是邪恶的:)然而,我需要使用一个合法的案例。
我知道对DllMain中可以执行的内容有严格的限制(没有LoadLibraries,没有COM初始化等等。)
我知道全局变量是在DllMain DLL_PROCESS_ATTACH之前初始化的。
全局变量初始化时是否有相同的限制?
我找到了Microsoft文章:http://msdn.microsoft.com/en-us/library/988ye33t 但是,它没有任何与限制相关的细节。
我还看到了另一个Stackoverflow问题:What happens to global variables declared in a DLL? 这里有一段摘录“在DllMain中有些东西是被禁止的。在构造函数中,这些东西可能也被禁止。”
然而,评论员似乎不确定这些限制是否确实存在。
我很感激有关此主题的任何信息。
答案 0 :(得分:6)
正如我在this answer中所解释的那样,真正的dll入口点(即真正的DllMain
)由CRT采用,在DLL_PROCESS_ATTACH
上初始化其内容,调用构造函数全局变量然后调用“假”DllMain
(即你作为程序员看到的DllMain
)。
MSDN文档调用DllMain
真实的 dll入口点,因此所有限制也适用于全局对象的构造函数,因为它们被调用。
这是避免全局变量的另一个原因:它们的构造函数中的代码是从DllMain
调用的,但这并不明显,因此如果在DllMain
中执行“禁止”的事情会出现问题在确认违规代码在这样的构造函数中之前可能需要花费很多时间。