代码之家  ›  专栏  ›  技术社区  ›  Steve Rowe

我如何知道dllmain何时完成?

  •  2
  • Steve Rowe  · 技术社区  · 16 年前

    我有工作需要在加载后尽快在一个DLL中完成。这项工作涉及同步,因此无法在dllmain内完成。有没有一种方法可以在dllmain(或所有dllmains)完成后立即触发代码执行?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Romain Hippeau    16 年前

    根据 this MSDN post :

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

    如果这是正确的,那么您应该能够在所讨论的线程中完成您的工作,直到dllmain完成后,该线程才会启动。当然,这会留下一些可能的同步问题,如果使用互斥体,也许可以解决这个问题。

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

    P.S.如果你尝试过,请留下一个关于它是否有效的评论。

        2
  •  2
  •   Mark Wilkins    16 年前

    从我的观点来看,这一直是一个棘手的问题。如果您无法控制的第三方应用程序正在使用DLL,则很难强制其他应用程序调用某些初始化函数。最终,这可能是一个要求,但最好不要使用dll(例如初始化winsock)。

    如果无法进行初始化调用,则可能需要依赖于按需进行的延迟初始化。我偶然发现一份相当不错的文件 DLL Best Practices 这也许值得一读。它有一个很好的列表,列出了在dllmain中可以做和不能做的具体事情。根据经验,我知道需要遵守这些规定(即“禁止”清单)。

        3
  •  0
  •   Brian R. Bondy    16 年前

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

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