c++ - 在获取 DLL_PROCESS_DETACH 之前需要通知 DLL 正在关闭
问题描述
我们有一个使用 C++11 在 Visual Studio 中构建的 DLL。此时我们的 DLL 有一个固定的 API,它包括一个open
andclose
函数(以及其他)。我们允许我们的用户在不关闭应用程序的情况open
下close
多次使用。在我们的 DLL 中,我们使用了一个第三方库,它不仅有一个open
and close
,还有一个initialize
and uninitialize
。
open
andclose
映射到我们的and open
,close
但initialize
anduninitialize
每次只能调用一次,在启动和关闭时。我initialize
只能从我们的函数中调用它们一次open
,但我找不到调用的地方uninitialize
,因为我不知道应用程序何时将关闭。调用它的最合乎逻辑的地方是DllMain
在DLL_PROCESS_DETACH
. 如果我只是放弃并删除他们的uninitialize
电话,我仍然会得到一个未处理的异常,并且在任何情况下我都不会干净地关闭。
有没有办法获得应用程序在之前关闭的信号/通知DLL_PROCESS_DETACH
?
解决方案
DLL 中没有这样的通知。 DllMain()
是 DLL 知道发生了什么的唯一地方。它的lpReserved
参数会告诉你是否DLL_PROCESS_DETACH
是由于调用FreeLibrary()
。这就是您从系统中获得的全部内容。
调试代码以找出异常发生的原因,然后修复或捕获它。
或者,跟踪您的 DLLopen()
和close()
被调用的次数。initialize()
在 1stopen()
调用 lib ,uninitialize()
在最后一次匹配调用 lib close()
。然后确保应用程序close()
在关机时调用您。
或者,将您自己的initialize()
和添加uninitialize()
到您的 DLL 以调用 lib 的相应函数,然后让应用程序initialize()
在启动/打开和uninitialize()
关闭时调用您的。
推荐阅读
- html - 即使我试图访问另一个页面,Angular 也会不断将我重定向到登录页面
- reactjs - Material-ui:扩展面板和折叠的区别
- python - sklearn.tree.DecisionTreeRegressor:当 max_leaf_nodes != None 时,树的深度大于指定的深度
- batch-file - 如何在错误日志文件中重定向成功命令的输出?
- java - 了解为什么根据 Java 内存模型在构造函数中启动线程是不安全的
- openid - 覆盖 Keycloak 授权端点
- graphql - 为什么 Apollo 使用较旧的 GraphQL 查询而不返回提供的字段
- r - 在问题下方添加空格以获取 PDF 中的书面答案
- sql - 选择每个地址居住人数的查询是什么?
- laravel - 将 Cart::content 发送到 Laravel 5.8 中的刀片