【发布时间】:2010-05-05 23:46:26
【问题描述】:
我有工作需要在 DLL 加载后立即完成。该工作涉及同步,因此无法在 dllmain 中完成。有没有办法在 dllmain(或所有 dllmain)完成后立即触发代码执行?
【问题讨论】:
我有工作需要在 DLL 加载后立即完成。该工作涉及同步,因此无法在 dllmain 中完成。有没有办法在 dllmain(或所有 dllmain)完成后立即触发代码执行?
【问题讨论】:
在进程启动和 DLL 期间 初始化例程,新线程 可以创建,但它们不会开始 执行直到 DLL 初始化 为过程完成。
如果这成立,那么您应该能够在有问题的线程中完成您的工作,该线程在 DLLMain 完成之前不会启动。当然,这会留下一些可能的同步问题,如果你使用互斥锁,也许你可以解决这个问题。
注意:我没有尝试过,只是理论上它看起来可能有效。
附:如果您尝试过,请评论它是否有效。
【讨论】:
CreateThread()(尽管它确实承认可以这样做)。如果您决定走那条路,请谨慎行事。
在我看来,这一直是一个棘手的问题。如果 DLL 被您无法控制的第 3 方应用程序使用,则很难强制其他应用程序调用某些初始化函数。最终,它可能是一个要求,但不必这样做以使用 DLL(例如,初始化 winsock)当然很好。
如果无法进行初始化调用,您可能需要依赖按需进行的延迟初始化。我在DLL Best Practices 上看到了一篇相当不错的论文,可能值得一读。它有一个很好的列表,列出了您可以在 DLLMain 中执行和不可以执行的特定操作。我从经验中知道这些需要遵守(“不要”列表)。
【讨论】:
最简单的方法可能是将所有代码放入加载库后调用的另一个函数中。
您也可以创建一个线程来完成这项工作,但我不确定您到底想要做什么。
【讨论】: