0

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 位 - 没什么特别的。它也发生在具有相同配置的其他机器上。

4

3 回答 3

1

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

  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };
  ZeroMemory(&open_filename, sizeof (OPENFILENAMEW));
  open_filename.lStructSize = sizeof (OPENFILENAMEW);
于 2009-05-29T07:49:30.747 回答
0

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

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

::CoInitializeEx(NULL, COINIT_MULTITHREADED);

嗯,把这个改成...

::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

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

我在网上搜索了这个,似乎很少有人面临同样的问题,但没有人发布上述解决方案。谁能验证我的发现?

于 2009-06-23T20:48:20.027 回答
0

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

于 2010-02-02T04:29:01.797 回答