【问题标题】:How can I check whether my code is executing within DllMain如何检查我的代码是否在 DllMain 中执行
【发布时间】:2011-04-06 07:20:59
【问题描述】:

我正在为某些系统编写插件,但是有一些行为不端的应用程序在 dll 初始化期间调用我的插件(来自 DllMain 或 InitInstance,它是 DllMain 的包装器)。

我想知道是否有办法找出代码是否在 DllMain 中执行。我不想在不导致死锁的情况下优雅地失败(我的插件正在执行的代码涉及 dll 加载、线程创建和等待事件,如果在 DllMain 中执行会导致死锁)。

我知道 CreateThread 在 DllMain 退出之前不会执行,但是我不能从另一个线程进行初始化,因为它涉及 COM。

【问题讨论】:

    标签: winapi dll


    【解决方案1】:

    实际上,您是在寻求一种查看加载程序锁定状态的方法,但是 Windows API 不允许这样做,因为它不会以任何方式公开加载程序锁定。即使您能够获得锁定状态,也不能保证它在执行后续代码期间保持不变——您必须获取它,这超出了整个目的,因为这是您想要避免的事情.

    据我所知,处理此问题的唯一实用方法是记录您的插件并禁止使用 DllMain()。如果这意味着某些组件所有者将不得不对其 DLL 初始化进行轻微的重新设计,那就这样吧。

    【讨论】:

      【解决方案2】:

      我不相信有任何系统提供的方法可以做到这一点。然而,由于加载程序锁保证一次只运行一个dllmain,因此很容易在dllmain 的开头设置一个标志并在结尾取消设置。

      【讨论】:

        【解决方案3】:

        当我遇到这种情况并且 printf 没有解决它时,我会尝试创建一个文件。使用您的消息作为文件名以及时间戳。这可能会对你有所帮助,祝你好运。

        【讨论】:

          【解决方案4】:

          当它发生时,没有机制可以检测到它。每个人都应该遵守规则。

          【讨论】:

            猜你喜欢
            • 2013-03-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多