1

我们有一个针对 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 间接使用。
4

2 回答 2

2

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

于 2012-03-12T16:06:50.343 回答
0

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

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

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

于 2012-03-12T14:47:59.007 回答