2012-03-12 4 views
1

У нас есть приложение, созданное против MFC9 (VC2008). Приложение является SDI-приложением и показывает диалог открытия файла во время InitInstance(). Отображение этого диалогового окна вызывает загрузку comdlg32.dll. Через несколько минут файл comdlg32.dll будет выгружен автоматически. После этого следующая функция, зависящая от DLL, выйдет из строя.Как избежать сбоя в приложении MFC SDI, вызванном разгруженным comdlg32.dll?

Как этого можно избежать? Что определяет автоматическую разгрузку/загрузку DLL?

Дополнительная информация:

  • Мы не видим эту проблему на WinXP с тем же приложением.
  • В Win7 это поведение произошло только с начала этого года - возможно, какое-то обновление MFC связано с этим?
  • Небольшое тестовое приложение не проявляет проблемного поведения - comdlg32.dll перезагружается при необходимости.
  • Мы нашли заявление Microsoft о том, что не рекомендуется использовать модальные диалоги в InitInstance() приложений MDI (http://support.microsoft.com/kb/173261) - у нас есть приложение SDI, хоть.
  • Мы не используем comdlg32.dll напрямую, только косвенно через MFC.

ответ

0

Вы не говорите, настраиваете ли вы свое диалоговое окно или это просто диалог с прямым файлом. Я думаю, что начиная с Vista, общий диалог с файлами был изменен. Я знаю, если вы сравните старый код MFC с более новым, вы увидите, что код MFC был изменен, чтобы воспользоваться этими изменениями. Например, IFileDialogEvents и IFileDialogControlEvents были реализованы в MFC для поддержки того, как Vista и более поздние версии ОС настраивают диалоговые окна файлов.

Я не знаю, есть ли у меня ответ, но только для усмешек. Вероятно, я обязательно позвоню AfxOleInitialize() в InitInstance(), прежде чем попытаюсь вызвать диалог с файлом.

Другое дело, что я постараюсь наверняка (так как он работает под XP) будет в конструкторе вашего CFileDialog, чтобы убедиться, что bVistaStyle задает значение FALSE. Это гарантирует, что для параметра m_bVistaStyle установлено значение FALSE, которое установлено при работе под XP.

+0

Нет, диалоговое окно файла не настроено. AfxOleInit() присутствует. – stmoebius

+0

Ну, я бы хотя бы попытался убедиться, что для bVistaStyle установлено значение ЛОЖЬ и посмотрите, не имеет ли это никакого эффекта. –

2

Вы должны позвонить InitCommonControlsEx в свое приложение при запуске. Это инициализирует файл comdlg32.dll, а также увеличит количество ссылок на dll, поэтому он не будет выгружен после закрытия диалога открытия файла/сохранения.

+0

У нас действительно не было InitCommonControlsEx. Однако добавить это не помогло. Есть ли способ проанализировать счетчик ссылок DLL? – stmoebius

 Смежные вопросы

  • Нет связанных вопросов^_^