【问题标题】:Limitation on usages of global variables in DLL (for Windows)DLL 中全局变量的使用限制(适用于 Windows)
【发布时间】:2011-02-09 23:00:23
【问题描述】:

首先,我知道全局变量是邪恶的 :) 但是,我需要使用一个是有正当理由的。

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

而且我知道全局变量是在 DllMain DLL_PROCESS_ATTACH 之前初始化的。

在全局变量初始化时我有同样的限制吗?

我找到了微软文章:http://msdn.microsoft.com/en-us/library/988ye33t 但是,它没有任何与限制相关的详细信息。

我还看到了另一个 Stackoverflow 问题:What happens to global variables declared in a DLL? 这里是来自那里的 sn-p “在 DllMain 中有些事情是被禁止的。那些事情在构造函数中也是可能被禁止的。”

但是,评论者似乎不确定这些限制是否真的存在。

我将不胜感激有关此主题的任何信息。

【问题讨论】:

    标签: c++ windows dll


    【解决方案1】:

    正如我在this answer 中解释的那样,真正的 dll 入口点(即真正的 DllMain)由 CRT 获取,在 DLL_PROCESS_ATTACH 上,初始化其内容,调用全局变量的构造函数,然后调用“假”DllMain(即你作为程序员看到的DllMain)。

    MSDN 文档调用DllMain real dll 入口点,因此所有限制也适用于全局对象的构造函数,因为它们是由它调用的。

    这是避免使用全局变量的另一个原因:它们的构造函数中的代码是从 DllMain 调用的,但这并不明显,因此如果在 DllMain 中执行“禁止”的事情时出现问题,可能需要一个在承认有问题的代码在此类构造函数中之前有很多时间。

    【讨论】:

    • 非常感谢 :) 答案非常明确,没有任何猜测的余地。
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多