更改过滤器时,GetOpenFileName()不会刷新

时间:2009-05-28 17:35:37

标签: c++ c winapi dialog

我使用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 个答案:

答案 0 :(得分:1)

你还没有做过的一件事可能是造成问题,那就是完全初始化OPENFILENAMEW结构,尤其是lStructSize元素。我之前见过这会引起奇怪的效果。我建议有像

这样的东西
  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };
  ZeroMemory(&open_filename, sizeof (OPENFILENAMEW));
  open_filename.lStructSize = sizeof (OPENFILENAMEW);

答案 1 :(得分:0)

好的,我已经找到了问题,或者至少我有一个适合我的解决方案。

在代码的前面,我进行了以下调用以初始化COM ...

::CoInitializeEx(NULL, COINIT_MULTITHREADED);

好吧,把它换成......

::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

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

我在网上搜索了这个,似乎很少有人面临同样的问题,但没有人发表上述解决方案。任何人都可以验证我的发现吗?

答案 2 :(得分:0)

谢谢你,beef2k。有用。 但我的问题有一点不同。 一切正常,直到我添加了SHBrowseForFolder调用。从那时起我就有了同样的效果。但是添加了CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);解决了这个问题。