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

У нас есть приложение, созданное для 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 ]

2 голосов
/ 12 марта 2012

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

0 голосов
/ 12 марта 2012

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

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

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

...