【问题标题】:How to avoid crash in MFC SDI application caused by unloaded comdlg32.dll?如何避免因卸载 comdlg32.dll 导致 MFC SDI 应用程序崩溃?
【发布时间】:2012-03-12 14:24:30
【问题描述】:

我们有一个针对 MFC9 (VC2008) 构建的应用程序。 该应用程序是一个 SDI 应用程序,并在 InitInstance() 期间显示一个文件打开对话框。显示该对话框会导致加载 comdlg32.dll。几分钟后,comdlg32.dll 会自动卸载。在此之后,依赖于 DLL 的下一个函数将崩溃。

如何避免这种情况?什么控制着 DLL 的自动卸载/加载?

更多信息:

  • 我们在使用相同应用程序的 WinXP 上没有发现此问题。
  • 在 Win7 上,这种行为是从今年年初才出现的 - 也许某些 MFC 更新与此有关?
  • 小型测试应用程序不会出现问题行为 - comdlg32.dll 会在需要时重新加载。
  • 我们发现 Microsoft 声明不建议在 MDI 应用程序的 InitInstance() 中使用模式对话框 (http://support.microsoft.com/kb/173261) - 我们有一个 SDI 应用程序,不过。
  • 我们不以任何方式直接使用 comdlg32.dll,仅通过 MFC 间接使用。

【问题讨论】:

    标签: windows-7 mfc comdlg32


    【解决方案1】:

    您必须在启动时在您的应用程序中调用InitCommonControlsEx。 这将初始化 comdlg32.dll 并增加 dll 的引用计数,因此在关闭文件打开/保存对话框后它不会被卸载。

    【讨论】:

    • 我们确实没有 InitCommonControlsEx。但是,添加它并没有帮助。有什么方法可以分析 DLL 的引用计数吗?
    【解决方案2】:

    您没有说是自定义对话框还是只是一个直接的文件对话框。我认为从 Vista 开始,公共文件对话框发生了一些变化。我知道如果您将旧 MFC 代码与新代码进行比较,您会发现 MFC 代码已被更改以利用这些更改。例如,在 MFC 中实现了 IFileDialogEvents 和 IFileDialogControlEvents,以支持 Vista 和更高版本的操作系统自定义文件对话框的方式。

    我不知道我是否有答案,但只是为了微笑,我可能会确保在尝试调用文件对话框之前的某个时间在 InitInstance() 中调用 AfxOleInitialize()。

    我肯定会尝试的另一件事(因为它在 XP 下工作)是在 CFileDialog 的构造函数中确保将 bVistaStyle 设置为 FALSE。这确保 m_bVistaStyle 设置为 FALSE,在 XP 下运行时设置为 FALSE。

    【讨论】:

    • 不,文件对话框不是自定义的。 AfxOleInit() 存在。
    • 好吧,我至少会尝试确保将 bVistaStyle 设置为 FALSE,看看是否有任何效果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2011-09-03
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多