首先,我知道全局变量是有害的:)但是,在合法情况下,为什么我需要使用一个。
我知道在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中禁止执行某些操作。在构造函数中也可能禁止这些操作。”
但是,似乎评论者不确定此类限制是否确实存在。
我将不胜感激有关此主题的任何信息。
最佳答案
如我的this answer中所述,真正的dll入口点(即真正的DllMain
)由CRT获取,即在DLL_PROCESS_ATTACH
上初始化其内容,调用全局变量的构造函数,然后调用“ fake”。 “ DllMain
(即您作为程序员所看到的是DllMain
)。
MSDN文档将DllMain
称为真正的dll入口点,因此所有限制也都适用于全局对象的构造函数,因为它们是由全局对象调用的。
这是避免使用全局变量的另一个原因:它们的构造函数中的代码是从DllMain
调用的,但这并不明显,因此,如果在DllMain
中执行“禁止”的操作而出现问题,则可能需要花费很多时间在确认有问题的代码在此类构造函数中之前。
关于c++ - DLL中全局变量的使用限制(对于Windows),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4951598/