Как избежать сбоев в приложении MFC SDI, вызванных выгрузкой comdlg32.dll?

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

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

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

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

2 ответа

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

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

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

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

Другие вопросы по тегам