简化问题(Y)
假设你需要在函数内部知道这个函数是否作为静态对象初始化的一部分被调用。是否有标准或平台特定的方法来实现这一点?
背景故事(X)
我深入研究了许多应用程序使用的 DLL 的源代码。这个 DLL 公开了一个 Init
函数,这个函数应该构造一个 boost::asio::deadline_timer
以便稍后使用(但是 DLL 可以在降级模式下工作而不需要它)。
问题在于计时器不能在静态对象初始化期间构造(DLL 加载时间),否则它的构造函数会死锁。
当然,每个人都会从各个地方(是的,多次!)调用 Init
,包括我无法编辑的源代码中的静态构造函数,因此需要检测这种情况并退出。
在实用主义战胜厌恶之后,我最终 沿着调用堆栈向上走,尝试找到 wWinMain
并推断出静态初始化已经完成。这很糟糕,并且不能与动态加载的二进制文件一起使用,但幸运的是这超出了我特定情况的范围。我真希望有一种更简洁的方法。
main()
。 - BarmarSetTimer
在User32.dll
中,而你不能在加载锁定期间调用它。是否有其他函数或一小组函数,您的DLL用户会调用,例如创建或打开类型的函数,虽然不经常调用但在某种程度上是必要的?如果尚未创建计时器,则可以创建计时器。 - 1201ProgramAlarmDLL_PROCESS_ATTACH
触发断点时的调用堆栈。你可以看到我仍然在 DLL 的初始化过程中。那可能是过程中的最后一次调用,但是从DllMain
构造io_service
也会死锁,因此我得出了这个结论。 - Quentin