【问题标题】:How can I know when dllmain is completed?我如何知道 dllmain 何时完成?
【发布时间】:2010-05-05 23:46:26
【问题描述】:

我有工作需要在 DLL 加载后立即完成。该工作涉及同步,因此无法在 dllmain 中完成。有没有办法在 dllmain(或所有 dllmain)完成后立即触发代码执行?

【问题讨论】:

    标签: dll winapi


    【解决方案1】:

    this MSDN post

    在进程启动和 DLL 期间 初始化例程,新线程 可以创建,但它们不会开始 执行直到 DLL 初始化 为过程完成。

    如果这成立,那么您应该能够在有问题的线程中完成您的工作,该线程在 DLLMain 完成之前不会启动。当然,这会留下一些可能的同步问题,如果你使用互斥锁,也许你可以解决这个问题。

    注意:我没有尝试过,只是理论上它看起来可能有效。

    附:如果您尝试过,请评论它是否有效。

    【讨论】:

    • 请注意:Mark Wilkins 的回答中提到的“最佳实践”文档建议不要致电CreateThread()(尽管它确实承认可以这样做)。如果您决定走那条路,请谨慎行事。
    • 我同意最好的方法是创建一个初始化例程并让 DLL 的用户调用它作为 API 的一部分。它很常见,即 WinSock 和 IBM MQSeries
    • 分离线程似乎奏效了。根据 Raymond Chen 的说法,你必须小心你在那里做的事情,因为如果你在 dllmain 内部等待那个线程,你可能会死锁。见blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx
    • 以上 raymond chen 链接已失效;新链接:devblogs.microsoft.com/oldnewthing/20070904-00/?p=25283
    【解决方案2】:

    在我看来,这一直是一个棘手的问题。如果 DLL 被您无法控制的第 3 方应用程序使用,则很难强制其他应用程序调用某些初始化函数。最终,它可能是一个要求,但不必这样做以使用 DLL(例如,初始化 winsock)当然很好。

    如果无法进行初始化调用,您可能需要依赖按需进行的延迟初始化。我在DLL Best Practices 上看到了一篇相当不错的论文,可能值得一读。它有一个很好的列表,列出了您可以在 DLLMain 中执行和不可以执行的特定操作。我从经验中知道这些需要遵守(“不要”列表)。

    【讨论】:

      【解决方案3】:

      最简单的方法可能是将所有代码放入加载库后调用的另一个函数中。

      您也可以创建一个线程来完成这项工作,但我不确定您到底想要做什么。

      【讨论】:

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