如何避免卸载comdlg32.dll导致MFC SDI应用程序崩溃



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

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

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

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

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

最新更新