【问题标题】:Need a notification that DLL is shutting down before getting DLL_PROCESS_DETACH在获取 DLL_PROCESS_DETACH 之前需要通知 DLL 正在关闭
【发布时间】:2020-09-23 20:44:16
【问题描述】:

我们有一个使用 C++11 在 Visual Studio 中构建的 DLL。此时我们的 DLL 有一个固定的 API,它包括一个 openclose 函数(等等)。我们允许我们的用户在不关闭应用程序的情况下多次openclose。在我们的 DLL 中,我们使用了一个第三方库,它不仅有 openclose,而且还有 initializeuninitialize

openclose 与我们的 openclose 紧密映射,但 initializeuninitialize 在启动和关闭时只能调用一次。我只能从我们的open 函数中调用他们的initialize 一次,但我找不到调用uninitialize 的地方,因为我不知道应用程序何时将被关闭。调用它的最合乎逻辑的地方是在DLL_PROCESS_DETACH 下的DllMain 函数中,虽然这在调试下运行时有效,但当我在发布下运行时,我们得到一个未处理的异常,“请求致命程序退出”。如果我只是放弃并删除他们的uninitialize 呼叫,我仍然会得到一个未处理的异常,并且在任何情况下我都不会干净地关闭。

有什么方法可以在DLL_PROCESS_DETACH 之前获得应用程序正在关闭的信号/通知?

【问题讨论】:

  • 你需要先研究为什么未处理的异常
  • 以及您之前需要此通知的原因是什么?为什么你决定 uninitialize 没有在这个通知中崩溃?
  • 应用程序致命退出 (FAST_FAIL_FATAL_APP_EXIT) 可能因各种原因发生,例如调用 C abort。要直接解决问题,您需要分析异常,找到直接原因,并通过断点进一步调查。这可能是一个上游错误,您可以报告并解决它,直到它得到解决。

标签: c++ windows dllmain


【解决方案1】:

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

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

或者,跟踪您的 DLL 的 open()close() 被调用了多少次。在第一个open() 上调用lib 的initialize(),在最后一个匹配的close() 上调用lib 的uninitialize()。然后确保应用在关机时调用您的close()

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

【讨论】:

    猜你喜欢
    • 2017-01-01
    • 2020-12-05
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多