首页 > 解决方案 > 在获取 DLL_PROCESS_DETACH 之前需要通知 DLL 正在关闭

问题描述

我们有一个使用 C++11 在 Visual Studio 中构建的 DLL。此时我们的 DLL 有一个固定的 API,它包括一个openandclose函数(以及其他)。我们允许我们的用户在不关闭应用程序的情况openclose多次使用。在我们的 DLL 中,我们使用了一个第三方库,它不仅有一个openand close,还有一个initializeand uninitialize

openandclose映射到我们的and opencloseinitializeanduninitialize每次只能调用一次,在启动和关闭时。我initialize只能从我们的函数中调用它们一次open,但我找不到调用的地方uninitialize,因为我不知道应用程序何时将关闭。调用它的最合乎逻辑的地方是DllMainDLL_PROCESS_DETACH. 如果我只是放弃并删除他们的uninitialize电话,我仍然会得到一个未处理的异常,并且在任何情况下我都不会干净地关闭。

有没有办法获得应用程序在之前关闭的信号/通知DLL_PROCESS_DETACH

标签: c++windowsdllmain

解决方案


DLL 中没有这样的通知。 DllMain()是 DLL 知道发生了什么的唯一地方。它的lpReserved参数会告诉你是否DLL_PROCESS_DETACH是由于调用FreeLibrary()。这就是您从系统中获得的全部内容。

调试代码以找出异常发生的原因,然后修复或捕获它。

或者,跟踪您的 DLLopen()close()被调用的次数。initialize()在 1stopen()调用 lib ,uninitialize()在最后一次匹配调用 lib close()。然后确保应用程序close()在关机时调用您。

或者,将您自己的initialize()和添加uninitialize()到您的 DLL 以调用 lib 的相应函数,然后让应用程序initialize()在启动/打开和uninitialize()关闭时调用您的。


推荐阅读