GetOpenFileName() does not refresh when changing filter
我使用
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); |
出现文件对话框,但是当我
- 更换过滤器或
- 点击"我的电脑"
文件列表变为空。 按下
编辑:我的系统是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); |
...为我解决了问题!现在,文件对话框再次过滤。
我在网上搜索了此内容,似乎很少有人遇到相同的问题,但是没有人发布上述解决方案。谁能验证我的发现?