2009-05-28 3 views
0

Я использую GetOpenFilename(), чтобы пользователь мог выбрать файл. Вот код: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] не помогает, но если я переключусь на родительскую папку и вернусь в исходную папку (в случае изменения фильтра), фильтрация будет прекрасной, и файлы появятся в списке.

EDIT: Моя система Windows XP (SP3) 32-разрядная - ничего особенного. Это происходит и на других машинах - с той же конфигурацией.

+0

ваш код выглядит ОК, и диалог корректно работает на XP (скомпилирован с _WIN32_WINNT 0x0501). Каковы особенности вашего дела? Это Vista? – Andrey

ответ

0

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

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

::CoInitializeEx(NULL, COINIT_MULTITHREADED); 

Ну, меняющийся это ...

::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 

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

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

1

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

OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) }; 
    ZeroMemory(&open_filename, sizeof (OPENFILENAMEW)); 
    open_filename.lStructSize = sizeof (OPENFILENAMEW); 
+0

OPENFILENAMEW open_filename = {sizeof (OPENFILENAMEW)}; делает именно то, что вы предложили. – Andrey

+0

Вздох, мой мозг сегодня не функционирует хорошо ... – DavidK

0

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

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

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