GetOpenFileName () не обновляется при смене фильтра - PullRequest
0 голосов
/ 28 мая 2009

Я использую GetOpenFilename(), чтобы позволить пользователю выбрать файл. Вот код:

  wchar_t buffer[MAX_PATH] = { 0 };

  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };

  open_filename.hwndOwner   = handle_;
  open_filename.lpstrFilter = L"Video Files\0*.avi;*.mpg;*.wmv;*.asf\0"
                              L"All Files\0*.*\0";
  open_filename.lpstrFile   = buffer;
  open_filename.nMaxFile    = MAX_PATH; 
  open_filename.lpstrTitle  = L"Open media file...";
  open_filename.Flags       = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

  ::GetOpenFileNameW(&open_filename);

Появляется диалоговое окно файла, но когда я

  • изменить фильтр или
  • нажмите « Мой компьютер »

список файлов становится пустым. Нажатие [F5] не помогает, но если я переключаюсь на родительскую папку и возвращаюсь к исходной папке (в случае изменения фильтра), фильтрация работает нормально, и файлы отображаются в списке.

РЕДАКТИРОВАТЬ: Моя система Windows XP (SP3) 32-разрядная - ничего особенного. Это происходит и на других машинах - с такой же конфигурацией -

Ответы [ 3 ]

1 голос
/ 29 мая 2009

Одна вещь, которую вы еще не сделали, которая может вызвать проблемы, - это полная инициализация структуры OPENFILENAMEW, особенно элемента lStructSize. Я видел, что это вызывает странные эффекты раньше. Я бы предложил иметь что-то вроде

  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };
  ZeroMemory(&open_filename, sizeof (OPENFILENAMEW));
  open_filename.lStructSize = sizeof (OPENFILENAMEW);
0 голосов
/ 02 февраля 2010

Спасибо, beef2k. Оно работает. Но у моей проблемы есть небольшая разница. Все работало нормально, пока я не добавил вызов SHBrowseForFolder. С того момента я получил тот же эффект. Но добавив CoInitializeEx (NULL, COINIT_APARTMENTTHREADED); решил проблему.

0 голосов
/ 24 июня 2009

Хорошо, я выяснил проблему, или, по крайней мере, у меня есть решение, которое работает для меня.

Ранее в коде у меня был следующий вызов для инициализации COM ...

::CoInitializeEx(NULL, COINIT_MULTITHREADED);

Ну, изменив это на ...

::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

... решает проблему для меня! Теперь диалог файлов снова фильтруется.

Я искал в Интернете это, и кажется, что очень немногие сталкиваются с той же проблемой, но никто не опубликовал вышеупомянутое решение. Может ли кто-нибудь проверить мои выводы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...