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

时间:2012-03-12 14:24:31

标签: windows-7 mfc comdlg32

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

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

更多信息:

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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