关于c ++:更改过滤器时不会刷新GetOpenFileName()

GetOpenFileName() does not refresh when changing filter

我使用GetOpenFilename()让用户选择一个文件。 这是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
  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位-没什么特别的。 它也发生在其他具有相同配置的计算机上。


您可能尚未引起问题的一件事是完全初始化OPENFILENAMEW结构,尤其是lStructSize元素。我以前见过这种情况会造成奇怪的影响。我建议吃些类似的东西

1
2
3
  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };
  ZeroMemory(&open_filename, sizeof (OPENFILENAMEW));
  open_filename.lStructSize = sizeof (OPENFILENAMEW);


谢谢,牛肉2k。有用。
但是我的问题有点不同。
一切正常,直到我添加了SHBrowseForFolder调用。从那一刻起,我得到了相同的效果。但是添加CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);解决了问题。


好的,我已经解决了这个问题,或者至少,我有一个对我有用的解决方案。

在代码的前面,我有以下调用来初始化COM ...

1
::CoInitializeEx(NULL, COINIT_MULTITHREADED);

好吧,将其更改为...

1
::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

...为我解决了问题!现在,文件对话框再次过滤。

我在网上搜索了此内容,似乎很少有人遇到相同的问题,但是没有人发布上述解决方案。谁能验证我的发现?