我使用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位 - 没什么特别的。它发生在其他机器上 - 具有相同的配置。
答案 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);解决了这个问题。